SQLite
SQLites是Android系统集成的一个轻量级数据库。
SQLiteDatabase
SQLiteDatabase代表了一个数据库,可以管理、操作数据库,SQLiteDatabase对象通过SQLiteOpenHelper的实例获取。
SQLiteOpenHelper
SQLiteOpenHelper是一个抽象类,用于进行数据库的创建、提供数据库版本升级和降级回调接口、获取SQLiteDatabase实例。
SQLiteOpenHelper必须被继承使用,非抽象类继承SQLiteOpenHelper时,需要重写onCreate()和onUpdate()。要被外部使用,还需要提供构造方法;数据库需要降级处理时,重写onDowngrade()方法;获取SQLiteDatabase的方法有两个,getWritableDatabase()和getReadableDatabase()。
- onCreate()方法通常在内部创建表,以及加入原始数据。
- onUpgrade()方法为数据库版本升级回调接口,处理数据库版本升级时的逻辑。
- onDowngrade()方法为数据库版本降级回调接口,处理数据库版本降级时的逻辑。
- getWritableDatabase()方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用的getWritableDatabase()方法就会出错。
- getReadableDatabase()方法则是先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。如果该问题成功解决,则只读数据库对象就会关闭,然后返回一个可读写的数据库对象。
构造方法一般传入上下文,数据库名字以及数据库版本,下面是SQLiteOpenHelper的构造方法的源码及说明。
/**
* Create a helper object to create, open, and/or manage a database.
* This method always returns very quickly. The database is not actually
* created or opened until one of {@link #getWritableDatabase} or
* {@link #getReadableDatabase} is called.
*
* @param context to use for locating paths to the the database
* @param name of the database file, or null for an in-memory database
* @param factory to use for creating cursor objects, or null for the default
* @param version number of the database (starting at 1); if the database is older,
* {@link #onUpgrade} will be used to upgrade the database; if the database is
* newer, {@link #onDowngrade} will be used to downgrade the database
*/
public SQLiteOpenHelper(@Nullable Context context, @Nullable String name,
@Nullable CursorFactory factory, int version) {
this(context, name, factory, version, null);
}
增
long insert(String table, String nullColumnHack, ContentValues values)
- @param table 代表想插入数据的表名
- @param nullColumnHack 代表强行插入null的列名。当values参数为null或者不包含任何键值对时该参生效
- @param values 表示一行记录的数据
- @return 新添记录的行号,该行号是一个内部值,与主见id无关,发生错误返回-1
//example
ContentValues values = new ContentValues();
values.put("name", "秦斌");
values.put("age", 27);
db.insert("user", null, values); //db为SQLiteDatabase实例
删
int delete(String table, String whereClause, String[] whereArgs)
- @param table 代表想删除数据的表名
- @param whereClause 满足该语句的记录将会被删除
- @param whereArgs 用于为whereClause子句传入参数
- @return 受此delete语句影响的记录的条数
//example
db.delete("user", "name = ?", new String[]{"秦斌"});
改
int update(String table, ContentValues values, String whereClause, String[] whereArgs)
- @param table 代表想更新数据的表名
- @param values 代表想更新的数据
- @param whereClause 满足该语句的记录将会被更新
- @param whereArgs 用于为whereClause子句传入参数
- @return 受此update语句影响的记录的条数
//example
ContentValues values = new ContentValues();
values.put("age", 26);
db.update("user", values, "name = ?", new String[]{"秦斌"});
查
//查询的方法多次被重载,还有rawQuery等查找方法。这里只列出其中一个方法,不一一赘述
Cursor query(boolean distinct, String table, String[] columns,
String selection, String[] selectionArgs, String groupBy,
String having, String orderBy, String limit)
- @param distinct 是否去除重复记录
- @param table 执行查询数据的表名
- @param columns 要查询出来的列名
- @param whereClause 满足该语句的记录将会被查找出来
- @param whereArgs 用于为whereClause子句传入参数
- @param groupBy 用于控制分组
- @param having 用于对分组进行过滤(avg、count、max、min、sum)
- @param orderBy 用于对记录进行排序(desc、asc)
- @param limit 用于分页
- @return 游标
//example
//人话:在数据库中查找user表,筛选出年龄在18到22岁的女性,获取她们的名字,年龄,电话,按年龄递增排序
Cursor cursor = db.query(true, "user", new String[]{"name", "age", "tel"},
"gender = ? and age > ? and age < ?", new String[]{"female", "18", "22"}, null,
null, "age asc", null);
SQL语句
查看源码可以得知,以上SQLiteDatabase增删改查的方法都是对sql语句进行了封装。
如果你精通sql语句,可以直接使用以下方法。
db.execSQL(sql);
SQL教程:http://www.w3school.com.cn/sql/index.asp
事务
SQLiteDatabase控制事务相关的方法
- beginTransaction() 开始事务
- endTransaction() 结束事务
- inTransaction() 判断上下文是否处于事务中,如果是则返回true,否则返回false
- setTransactionSuccessful() 设置事务成功
//example
db.beginTransaction();
try {
//执行数据库操作
...
//调用该方法设置事务成功;否则endTransaction()方法将回滚业务
db.setTransactionSuccessful();
} finally {
//由事务的标志决定是提交事务还是回滚事务
db.endTransaction();
}
可存储的数据类型
右上图可以看出,数据类型为Byte、Long、Float、Short、byte[]、Double、String、Boolean和Integer都可以通ContentValues存储到数据库中。
序列化的bean也可以保存到数据库中,相关查阅网上文档。
相关终端命令
adb shell //进入管道模式
cd /data/data/<包名>/databases/ //去到应用对应的包的数据库目录
sqlite3 <db名> //进入到你选择的数据库当中
.tables //查看数据库中含有的表
.schema <表名> //查看表结构
select * from <表名>; //可以执行任何sql语句,这里只是举个例子,查询表所有数据。注意命令最后一定要有;
.dump //查看表所有数据
.quit //退出sqlite
.help //展示所有点命令及用法