原生数据库框架
sqlite Databases
介绍一下
sqlite 是一种数据库,使我们的应用和与之交互的设备上创建一个本地数据库。Lite 一词是指典型数据库的轻量级版本(lightweight version)。对应地就存在着重量级数据库,例如 MysqL,它可以提供更加复杂的功能。sqlite 不需要服务器,数据存储在设备的本地文本文件里。sqlite 是免费开源的,并且是 Android 自带的数据库这就是为什么需要学习这一特定类型的数据库。
首先创建数据库管理类:
class MysqLiteHelper(
context: Context?,
name: String?,
factory: sqliteDatabase.CursorFactory?,
version: Int
) : sqliteOpenHelper(context, name, factory, version) {
val sql1 =
"create table User(id integer primary key autoincrement, name text(4),address text(5))"
val sql2 =
"create table Test1 (id integer primary key autoincrement, name text(4),address text(5))"
override fun onCreate(db: sqliteDatabase?) {
db!!.execsql(sql1)
}
override fun onUpgrade(db: sqliteDatabase?, oldVersion: Int, newVersion: Int) {
when (oldVersion) {
1 -> db!!.execsql(sql1)
}
}
}
十分简单的代码,集成抽象类sqliteOpenHelper,实现里面的两个抽象方法:
- onCreate 第一次创建数据库时调用 这里通常用来做表的创建
- onUpgrade 当数据库版本改变进行调用,通常用来做修改表和备份重载,其中老版本和新版本号一同传入该方法作为我们判断从某个版本过渡到另一个版本的逻辑
接下来即可在其他地方使用:
//参数User为数据库名称 1为该数据库的版本号
val MysqLiteHelper = MysqLiteHelper(applicationContext, "TestDatabase", null, 1)
这样我们的数据库就创建出来了
- getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用的是getWritableDatabase() 方法就会出错。
- getReadableDatabase()方法则是先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。如果该问题成功解决,则只读数据库对象就会关闭,然后返回一个可读写的数据库对象。
接下来我们用getWritableDatabase()进行操作数据库:
val writableDatabase = MysqLiteHelper.getWritableDatabase();
有了sqliteDatabase对象即可进行数据库的CRUD等操作
其中有两种常用操作方法:
增
方式一:
val insert: String = StringBuilder()
.append("insert into User(name,address) values ('")
.append("Elizabeth").append("','").append("beijing").append("')")
.toString()
writableDatabase.execsql(insert)
方式二
val contentValues = ContentValues()
contentValues.put("name", "Elizabeth2")
contentValues.put("address","shanghai")
//第二个参数是要指定插入的列,null表示插入所有列, 第三个参数是 `ContentValues` 对象,将要填入数据库中的数据
writableDatabase.insert("User", null, contentValues)
查:
方式一
val query = "select * from User"
val cursor = writableDatabase.rawQuery(query, null)
while (cursor.movetoNext()){
println("查询到: ${cursor.getString(cursor.getColumnIndex("id"))} ${cursor.getString(cursor.getColumnIndex("name"))} ${cursor.getString(cursor.getColumnIndex("address"))}")
}
方式二
val selection = "address = ?"
val str = arrayOf("shanghai")
//第二个参数是要查询的列,
//第三、第四个参数是要查询的条件,?是占位符
//后面三个分别是gruopby having 和 orderBy
val cursor = writableDatabase.query("User", null, selection, str, null, null, null)
while (cursor.movetoNext()){
println("查询到: ${cursor.getString(cursor.getColumnIndex("id"))} ${cursor.getString(cursor.getColumnIndex("name"))} ${cursor.getString(cursor.getColumnIndex("address"))}")
}
删:
方式二
writableDatabase.delete("User", "name = ? or address = ?", arrayOf("Elizabeth", "address"))
改:
方式二:
val contentValues = ContentValues()
contentValues.put("name", "Elizabeth2")
contentValues.put("address", "dalian")
writableDatabase.update("User", contentValues, "id = ?",
arrayOf("2")
)
数据库版本升级操作
场景:
app升级后数据库版本需要从V1.0升级到V2.0,那么老用户是安装了V1.0需要升级到v2.0,这时不会走继承sqliteOpenHelper的onCreate,而是直接走onUpgrade,因此我们需要在onUpgrade中写更新代码V1.0->V2.0,当又有新版本V3.0时,这是就需要写两个更新代码:V1.0->V3.0和V2.0->V3.0 或者说只增加V2.0->V3.0的更新代码,然后进行逐级更新:V1.0->V2.0->V3.0