Android Jetpack Room 快速使用入门

95 阅读2分钟

本文主要参考codelibs上面的使用方式,废话不多说,直接上流程

Step 1 引入依赖

在build.gradle中添加依赖

apply plugin: 'kotlin-kapt'

dependencies{
    def room_version = "2.5.0"

    implementation "androidx.room:room-ktx:$room_version"
    kapt "androidx.room:room-compiler:$room_version"
    androidTestImplementation "androidx.room:room-testing:$room_version"
}

Step 2 创建数据实体类,确定数据表

@Entity("table_commemoration") // 表名
data class CommemorationDayEntity(var bgUrl: String?,  
                                  var content: String, 
                                  var date: Long,
                                  var showInDesktop:Boolean = false 
                                ) {
    // 主键,自增
    @PrimaryKey(autoGenerate = true) var id: Int = 0 
}

Step 3 创建DAO层(表操作)


@Dao
interface CommemorationDAO {
    @Query("SELECT * FROM table_commemoration")
    suspend fun getAllData(): List<CommemorationDayEntity>

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insert(data: CommemorationDayEntity)

    @Query("DELETE FROM table_commemoration")
    suspend fun deleteAll()

    @Update
    suspend fun update(data: CommemorationDayEntity)
}

@Dao 注解会将此接口标记为Room 的 DAO 类
@Query 后的参数填入 sql 语句,用于进行一些复杂的sql操作
@Insert @Delete @Update 三个注释不需要参数,Room会帮我们完成操作。

Room不允许在主线程操作数据库,加了挂起标识Room会自己处理线程问题,不加的话就需要我们自己要注意DAO的函数要在子线程中执行。

Step 4 创建数据库

@Database(entities = arrayOf(CommemorationDayEntity::class), version = 1, exportSchema = false)
public abstract class StarRoomDatabase : RoomDatabase() {

    abstract fun CommemorationDao(): CommemorationDAO

    companion object {

        @Volatile
        private var INSTANCE: StarRoomDatabase? = null

        fun getDatabase(context: Context): StarRoomDatabase {
            return INSTANCE ?: synchronized(this) {
                val instance = Room.databaseBuilder(
                    context.applicationContext,
                    StarRoomDatabase::class.java,
                    "star_database"
                ).build()
                INSTANCE = instance
                instance
            }
        }
    }
}

官方写法,DLC单例创建数据库实例
注意上方注解
enetites:顾名思义,需要将 所有的数据表Class 作为参数传入
version:数据库版本,用于数据升级
exportSchema:数据库迁移相关,暂忽略

这一步,我们便完成了数据库的创建,数据表的创建,数据表和DAO层的关联,剩下的数据库抽象类实现,DAO层interface的实现,Room框架都会帮我们完成。

Step 5 使用数据库

先获取数据库单例对象,然后通过单例对象拿到 DAO,通过DAO 对数据表进行操作

GlobalScope.launch {
    StarRoomDatabase.
    getDatabase(MyApplication.instance).
    CommemorationDao().
    insert(CommemorationDayEntity(null,"123465",1663430400000))
}

可以通过 App Inspector 看到我们的数据库已经创建成功 并成功插入数据了

image.png

Step 6 改进

当然上面的写法只是偷懒的写法,实际代码中,应该还添加了一层Repository ,在Repository 层中去 操作DAO,然后通过 ViewModel中的 viewModelScope 协程域 里面去操作 Repository 层中的函数,使用Flow或LiveData跟UI层进行交互,完成整个异步数据库操作。