SQLite的使用情景以及用法
为什么要用SQLite
1.不需要一个单独的服务器进程或操作的系统(无服务器的)。
2.SQLite 不需要配置,这意味着不需要安装或管理。
3.一个完整的 SQLite 数据库是存储在一个单一的跨平台的磁盘文件。
4.SQLite 是非常小的,是轻量级的,完全配置时小于 400KiB,省略可选功能配置时小于250KiB。
5.SQLite 是自给自足的,这意味着不需要任何外部的依赖。
6.SQLite 事务是完全兼容 ACID 的,允许从多个进程或线程安全访问。
7.SQLite 支持 SQL92(SQL2)标准的大多数查询语言的功能。
8.SQLite 使用 ANSI-C 编写的,并提供了简单和易于使用的 API。
9.SQLite 可在 UNIX(Linux, Mac OS-X, Android, iOS)和 Windows(Win32, WinCE, WinRT)中运行。
什么是SQLite
SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库一样,您不需要在系统中配置。就像其他数据库,SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。SQLite 直接访问其存储文件。
如何创建数据库和数据表
1.SQLiteOpenHelper帮助类,借助这个类就可以非常简单地对数据库进行创建和升级。 SQLiteOpenHelper 是一个抽象类
2.SQLiteOpenHelper 中有两个抽象方法,分别是onCreate()和 onUpgrade(),我们必须在自己的帮助类里面重写这两个方法,然后分别在这两个方法中去实现创建、升级数据库的逻辑
3.SQLiteOpenHelper中还有两个非常重要的实例方法, getReadableDatabase()和getWritableDatabase()这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。不同的是,当数据库不可写入的时候(如磁盘空间已满)getReadableDatabase()方法返回的对象将以只读的方式去打开数据库,而getWritableDatabase()方法则将出现异常。
1、新建一个MySQLite继承SQLiteOpenHelper
public class MySQLite extends SQLiteOpenHelper {
//数据库的名字
public static String DB_NAME="MySQLite.db";
// 构造方法源码
// public MySQLite(Context context, String name数据库名,SQLiteDatabase.CursorFactory factory标的工厂, int version版本) {
// super(context, name, factory, version);
// }
//已经在父类里面加入了数据库名字,这里方法里可以省略
public MySQLite(Context context, int version) {
super(context, DB_NAME, null, version);
//创建数据库
}
//数据库第一次创建时被调用
@Override
public void onCreate(SQLiteDatabase db) {
//创建表的代码,添加id主键
db.execSQL("create table 表名 (_id integer primary key autoincrement)");
}
//软件版本号发生改变的时候调用
@Override//旧版本oldVersion,新版本newVersion
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//增加内容之后,比如添加了一个列或一个表之后,需要把版本号更新就会执行这个方法
}
}
2、调用构造方法创建数据库实例
MySQLite sqlhelper=new MySQLite(this, 1);
SQLiteDatabase实现增、删、改(更新)、查
调用 SQLiteOpenHelper的getReadableDatabase()或getWritableDatabase()
这两个方法还都会返回一个SQLiteDatabase对象,借助这个对象就可以对数据进行 CRUD 操作了
添加数据
MySQLite sqlhelper=new MySQLite(this, 1);
SQLiteDatabase sd = sqlhelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("列名",值)
sd.insert(表名, null, values);
*SQLiteDatabase 中提供了一个 insert()方法,添加数据。
insert(String table, String nullColumnHack, ContentValues values)
它接收三个参数,
第一个参数是表名,我们希望向哪张表里添加数据,这里就传入该表的名字。
第二个参数用于在未指定添加数据的情况下给某些可为空的列自动赋值,不用直接传入 null 即可。
第三个参数是一个 ContentValues 对象,它提供了一系列的 put()方法重载,用于向 ContentValues 中添加数据,*
删除数据
比如删除id大于10的数据
sd.delete(表名, "_id>?", new String[]{"10"});
*SQLiteDatabase 中提供了一个 delete()方法,删除数据
delete(String table, String whereClause, String[] whereArgs)
这个方法接收三个参数,
第一个参数是表名,第二、第三个参数又是用于去约束删除某一行或某几行的数据,不指定的话默认就是删除所有行*
修改(更新)数据
*SQLiteDatabase 中也 update()方法用于对数据进行更新 update(String table,ContentValues values, String whereClause, String[] whereArgs)
将要更新的数据添加到ContentValues里,在通过约束修改更新数据*
查询数据
*SQLiteDatabase 中提供了一个 query()方法用于对数据进行查询
query(String table,查询的表名
String[] columns,查询的列名
String selection, 指定 where 的约束条件
String[] selectionArgs,为 where 中的占位符提供具体的值
String groupBy, 指定需要 group by 的列
String having,对 group by 后的结果进一步约束
String orderBy)指定查询结果的排序方式
不需要的直接填null*
直接使用SQL执行增删改查
MySQLite sqlhelper=new MySQLite(this, 1);
SQLiteDatabase sd = sqlhelper.getWritableDatabase();
//添加
sd.execSQL("insert into 表名 values(?,?)",new String[]{"",""})
//删除
sd.execSQL("delete from 表名 where _id=?",new String[]{""})
//修改(更新)
sd.execSQL("update 表名 set 列更改表达式? where 条件?,new String[]{"",""})
//查询
sd.rawQuery("select 列名 from 表名", null);
*SQLiteDatabase下的execSQL( )方法和rawQuery( )方法
execSQL(String sql, Object[] bindArgs)
rawQuery(String sql,String[] selectionArgs)*