Android原生数据库操作

原生数据库框架

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,实现里面的两个抽象方法

  1. onCreate 第一次创建数据库调用 这里通常用来做表的创建
  2. onUpgrade 当数据库版本改变进行调用,通常用来做修改表和备份重载,其中老版本和新版本号一同传入该方法作为我们判断从某个版本过渡到另一个版本的逻辑

接下来即可在其他地方使用:

//参数User为数据库名称 			1为该数据库的版本号 
val MysqLiteHelper = MysqLiteHelper(applicationContext, "TestDatabase", null, 1)

这样我们的数据库就创建出来了

  1. getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用的是getWritableDatabase() 方法就会出错。
  2. getReadableDatabase()方法则是先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。如果该问题成功解决,则只读数据库对象就会关闭,然后返回一个可读写的数据库对象。

接下来我们用getWritableDatabase()进行操作数据库

val writableDatabase = MysqLiteHelper.getWritableDatabase();

有了sqliteDatabase对象即可进行数据库的CRUD等操作
其中有两种常用操作方法

  1. 直接用执行sql语句
  2. 使用sqliteDatabase对象封装的方法

方式一:

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

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...