简介
大多数应用程序即使在用户关闭应用程序后也需要保留数据。例如,该应用程序可能会存储播放列表,游戏项目清单,费用和收入记录,星座目录或一段时间内的睡眠数据。通常,您将使用数据库来存储持久性数据。
Room是Android Jetpack的结构组件的一部分。Room负责建立和配置数据库的许多繁琐工作,并使您的应用程序可以使用普通的函数调用与数据库进行交互。Room是在一个SQLite数据库的顶部的抽象层。
它主要由Entity, Dao, Database三个部分组成。
Entity
用于定义封装实际数据的实体类,每个实体类都会在数据库中有一张对应的表。并且表中的列是根据实体类中的字段自动生成的。
Dao
Dao是数据访问对象的意思,通常在这里对数据库的各项操作进行封装,实际编程时,逻辑层就不需要和底层数据库打交道了,直接和Dao层进行交互。
Database
定义数据库中的关键信息,包括数据库版本号,包含哪些实体类以及提供Dao层的访问实例。
推荐架构

使用步骤
1. 添加依赖
在app级build.gradle中添加如下依赖,版本号根据情况来定
apply plugin: 'kotlin-kapt'
dependencies{
    ...
    implementation "androidx.room:room-runtime:2.0.0"
    kapt "androidx.room:room-compiler:2.0.0"
    ...
}2. 添加实体类
可以有多个实体类
@Entity(tableName = "daily_sleep_quality_table")
data class SleepNight(
        @PrimaryKey(autoGenerate = true)
        var nightId: Long = 0L,
        @ColumnInfo(name = "start_time_milli")
        val startTimeMilli: Long = System.currentTimeMillis(),
        @ColumnInfo(name = "end_time_milli")
        var endTimeMilli: Long = startTimeMilli,
        @ColumnInfo(name = "sleep_rating")
        var sleepQuality: Int = -1
)3. 添加Dao类
@Dao
interface SleepDatabaseDao{
    @Insert
    fun insert(night: SleepNight)
    @Update
    fun update(night: SleepNight)
    @Query("SELECT * from daily_sleep_quality_table WHERE nightId = :key")
    fun get(key: Long): SleepNight?
    @Query("DELETE FROM daily_sleep_quality_table")
    fun clear()
    @Query("SELECT * FROM daily_sleep_quality_table ORDER BY nightId DESC LIMIT 1")
    fun getTonight(): SleepNight?
    @Query("SELECT * FROM daily_sleep_quality_table ORDER BY nightId DESC")
    fun getAllNights(): LiveData<List<SleepNight>>
}4. 定义Database
这部分的写法非常固定,可以以此为模板。
@Database(entities = [SleepNight::class], version = 1, exportSchema = false)
abstract class SleepDatabase : RoomDatabase() {
    abstract val sleepDatabaseDao: SleepDatabaseDao
    companion object {
        @Volatile
        private var INSTANCE: SleepDatabase? = null
        @Synchronized
        fun getInstance(context: Context): SleepDatabase {
            var instance = INSTANCE
            if (instance == null) {
                instance = Room.databaseBuilder(
                        context.applicationContext,
                        SleepDatabase::class.java,
                        "sleep_history_database"
                )
                        .fallbackToDestructiveMigration()
                        .build()
                INSTANCE = instance
            }
            return instance
        }
    }
}在UI控制器中添加数据库实例
添加在onCreateView方法中
val application = requireNotNull(this.activity).application
val dataSource = SleepDatabase.getInstance(application).sleepDatabaseDao