Room 数据库框架最全攻略

2021-03-12  本文已影响0人  sunjiandev

Room 数据库框架最全攻略

RoomGoogle官方推出的Android Sqlite数据库处理框架,是子啊Sqlite上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库。本文的目的旨在对于Room框架可以快速上手,内容分为两部分,第一部分为数据库的基本操作(增、删、改、查),第二部数据库的升级,加密

image

基本使用

基本工作的准备

plugins {
    id 'com.android.application'
    id 'kotlin-android'
    id 'kotlin-kapt'//在此处引入kapt插件
}

...

dependencies {
    ...
    
    def room_version = "2.2.6" // check latest version from docs
    implementation "androidx.room:room-runtime:$room_version"
    kapt "androidx.room:room-compiler:$room_version"
    
    ...
}



以上准备工作就做的差不多了,接下来开始建立数据库表


object DBHelper {
    val db = Room.databaseBuilder(
        App.context,
        AppDatabase::class.java,
        "snukaisens"
    ).build()
}

数据库升级

在开发过程中难免会碰到数据库表结构的改变,碰到这种情况,我们就需要对数据库表的结构进行升级,sqlite支持的数据库表结构的操作说明:

SQLite supports a limited subset of ALTER TABLE. The ALTER TABLE command in SQLite allows the user to rename a table or to add a new column to an existing table. It is not possible to rename a column, remove a column, or add or remove constraints from a table.

大致意思就是说,支持字段的添加和修改,不支持删除。所以针对数据库结构的升级就只是正对字段的添加和修改

我们正对之前Entity类进行操作,新增加一个e_mail字段

@Entity()
data class User(
    @ColumnInfo(name = "first_name")
    val firstName: String,
    @ColumnInfo(name = "last_name")
    var lastName: String,
    @ColumnInfo(name = "age")
    var age: Int = 0



) {
    @PrimaryKey(autoGenerate = true)
    var uid: Int = 0

    @ColumnInfo
    var email: String = ""//新增的数据库字段
}
@Database(entities = [User::class],version = 2)//版本号有原来的 1 -> 2
abstract class AppDatabase : RoomDatabase() {

    abstract fun getUserDao(): UserDao

}
 val db = Room.databaseBuilder(
        App.context,
        AppDatabase::class.java,
        "snukaisens"
    ).addMigrations(Migration_1_2())
        .build()


//此处需要重点说明一下,添加字段之后,需要设置 NOT NULL属性,而且需要给默认值,要不然数据库迁移过程中就会提示,创建的数据库信息,和预期的不一致,从而导致闪退
 class Migration_1_2 : Migration(1,2){
        override fun migrate(database: SupportSQLiteDatabase) {
           database.execSQL("alter table User add column email TEXT NOT NULL DEFAULT ''")
        }
    }

数据库 User表中添加的email字段就成功了,接下来说一下,修改字段,还是以上面的带吗为例,添加字段之后,发现 email 这个字段好像不是很对,要修改成 e_mail,需要修改的内容如下:


//1.第一处需要修改的地方  修改字段
@Entity()
data class User(
    @ColumnInfo(name = "first_name")
    val firstName: String,
    @ColumnInfo(name = "last_name")
    var lastName: String,
    @ColumnInfo(name = "age")
    var age: Int = 0



) {
    @PrimaryKey(autoGenerate = true)
    var uid: Int = 0

    @ColumnInfo
    var e_mail: String = ""//字段重新修改
}

//2.修改版本号,记住这个版本
@Database(entities = [User::class],version = 2)
abstract class AppDatabase : RoomDatabase() {
    abstract fun getUserDao(): UserDao
}
//3.添加迁移配置
object DBHelper {
    val db = Room.databaseBuilder(
        App.context,
        AppDatabase::class.java,
        "snukaisens"
    ).addMigrations(Migration_1_2(),Migration_2_3())//注意此处需要传的参数是可变参数,直接添加就行了,不需要把之前的都删了
        .build()

    class Migration_1_2 : Migration(1,2){
        override fun migrate(database: SupportSQLiteDatabase) {
           database.execSQL("alter table User add column email TEXT NOT NULL DEFAULT ''")
        }

    }
    //修改字段 Migration 这个类构造中传的字段就是 数据库的升级前和升级后的版本号,一定要和 2 中的数字对应
    class Migration_2_3 : Migration(2,3){
        override fun migrate(database: SupportSQLiteDatabase) {
            database.execSQL("alter table User rename column email to e_mail")
        }

    }
}

到此,数据库的修改就完成了。

数据库加密

在实际开发过程过程中,设计到安全问题,手机root过之后,用户可以随意拿到数据库文件,进行查看。针对一些敏感的数据库数据,需要对其进行加密。本文采用

库进行操作,操作很简单。

//引入依赖
implementation "net.zetetic:android-database-sqlcipher:4.4.2"
...

//添加配置
 private val factory = SupportFactory("xxxxxx".toByteArray())//此处xxxxxx 用户根据自己的情况自己配置
    val db = Room.databaseBuilder(
        App.context,
        AppDatabase::class.java,
        "snukaisens"
    ).addMigrations(Migration_1_2(), Migration_2_3())
        .openHelperFactory(factory)//添加factory
        .build()

这样就可以了,数据库加密就完成了,是不是很简单

上一篇下一篇

猜你喜欢

热点阅读