Loading... ## 简介 大多数应用程序即使在用户关闭应用程序后也需要保留数据。例如,该应用程序可能会存储播放列表,游戏项目清单,费用和收入记录,星座目录或一段时间内的睡眠数据。通常,您将使用数据库来存储持久性数据。 Room是Android Jetpack的结构组件的一部分。Room负责建立和配置数据库的许多繁琐工作,并使您的应用程序可以使用普通的函数调用与数据库进行交互。Room是在一个SQLite数据库的顶部的抽象层。 它主要由Entity, Dao, Database三个部分组成。 #### Entity 用于定义封装实际数据的实体类,每个实体类都会在数据库中有一张对应的表。并且表中的列是根据实体类中的字段自动生成的。 #### Dao Dao是数据访问对象的意思,通常在这里对数据库的各项操作进行封装,实际编程时,逻辑层就不需要和底层数据库打交道了,直接和Dao层进行交互。 #### Database 定义数据库中的关键信息,包括数据库版本号,包含哪些实体类以及提供Dao层的访问实例。 ---------- ## 推荐架构 ![使用Room的总体架构](https://s1.ax1x.com/2020/06/04/t0TGz8.png) ---------- ## 使用步骤 #### 1. 添加依赖 在app级build.gradle中添加如下依赖,版本号根据情况来定 ```gradle apply plugin: 'kotlin-kapt' dependencies{ ... implementation "androidx.room:room-runtime:2.0.0" kapt "androidx.room:room-compiler:2.0.0" ... } ``` #### 2. 添加实体类 可以有多个实体类 ```kotlin @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类 ```kotlin @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 这部分的写法非常固定,可以以此为模板。 ```kotlin @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方法中 ```kotlin val application = requireNotNull(this.activity).application val dataSource = SleepDatabase.getInstance(application).sleepDatabaseDao ``` 最后修改:2020 年 06 月 05 日 06 : 55 PM © 允许规范转载