Android中Room 持久性库使用

871 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情

Room

Room 持久性库在 SQLite 的基础上提供了一个抽象层,它是 Android 官方推出的 ORM 框架,它屏蔽了数据库访问的细节,可以让开发者使用时更容易上手,并且能享有更安全健壮的数据库访问机制。

基本使用

1.导入Room

implementation "androidx.room:room-runtime:2.4.2"
implementation "androidx.room:room-ktx:2.4.2"
kapt "androidx.room:room-compiler:2.4.2" 

2.创建实体类

@Entity
data class Student(
    @PrimaryKey(autoGenerate = true) val uid: Int,
    @ColumnInfo(name = "real_name") val realName: String?,
    val age: Int?
)
标题
@Entity表示数据库中的表
@PrimaryKey表示当前字段为主键,autoGenerate=true表示Room自定为实体实例分配ID
@ColumnInfo表示当前字段在数据库中的字段名

3.创建数据访问对象(DAO)

创建接口Dao——StudentDao,提供与 student 表中的数据交互的方法,Room给我们提供了很多方便的注解,可以让开发者无需关注SQL语句就完成简单的增删改查。如下

@Dao
abstract class StudentDao {
    @Insert
    abstract fun insertStudent(student: Student)

    @Update
    abstract fun updateStudent(student: Student)

    @Delete
    abstract fun deleteStudent(student: Student)

    @Query("SELECT * FROM STUDENT")
    abstract fun getAllStudent():List<Student>
}
标题
@Dao表示为访问数据库操作接口
@Insert新增,调用 @Insert 方法时,Room 会将每个传递的实体实例插入到相应的数据库表中。
@Update更新
@Delete删除指定的数据
@Query可以通过编写指定的Sql,完成从数据库中查询数据

4.创建AppDatabase用以保存数据库

AppDatabase由于实例成本很高,所以实例化的时候一般使用单例模式

@Database(entities = [Student::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun studentDao(): StudentDao
}

5.创建数据库管理工具

object AppDataBaseHelper {
    private var dataBase: AppDataBase? = null
    fun getDB(): AppDataBase {
        if (null == dataBase) {
            throw RuntimeException("请先init database")
        }
        return dataBase!!
    }
    fun initDb(application: Application) {
        dataBase = Room.databaseBuilder(
            application,
            AppDataBase::class.java,
            "app_db")
            .build()
    }
}

Application中调用AppDataBaseHelper.initDb(application)完成初始化,之后就可以调用AppDataBaseHelper.getDB().studentDao()获取DAO完成对Student的增删改查

6.数据库升级

在很多时候,我们的表结构并不是一开始就设计的很完善,所以在版本迭代的过程中我们可能需要用到数据库升级,如下是增加Teacher

val MIGRATION_1_2: Migration = object : Migration(1, 2) {
    override fun migrate(database: SupportSQLiteDatabase) {
        database.execSQL(
            "CREATE TABLE `Teacher` (`id` INTEGER, "
                    + "`name` TEXT, PRIMARY KEY(`id`))"
        )
    }
}

先定义Migration,然后在上一步创建AppDataBase的地方添加addMigrations()方法,即

fun initDb(application: Application) {
    dataBase = Room.databaseBuilder(
        application,
        AppDataBase::class.java,
        "app_db")
        .addMigrations(MIGRATION_1_2)
        .build()
}