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