简介

大多数应用程序即使在用户关闭应用程序后也需要保留数据。例如,该应用程序可能会存储播放列表,游戏项目清单,费用和收入记录,星座目录或一段时间内的睡眠数据。通常,您将使用数据库来存储持久性数据。

Room是Android Jetpack的结构组件的一部分。Room负责建立和配置数据库的许多繁琐工作,并使您的应用程序可以使用普通的函数调用与数据库进行交互。Room是在一个SQLite数据库的顶部的抽象层。

它主要由Entity, Dao, Database三个部分组成。

Entity

用于定义封装实际数据的实体类,每个实体类都会在数据库中有一张对应的表。并且表中的列是根据实体类中的字段自动生成的。

Dao

Dao是数据访问对象的意思,通常在这里对数据库的各项操作进行封装,实际编程时,逻辑层就不需要和底层数据库打交道了,直接和Dao层进行交互。

Database

定义数据库中的关键信息,包括数据库版本号,包含哪些实体类以及提供Dao层的访问实例。


推荐架构

使用Room的总体架构


使用步骤

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
最后修改:2020 年 06 月 05 日
如果觉得我的文章对你有用,请随意赞赏