本文主要参考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 看到我们的数据库已经创建成功 并成功插入数据了
Step 6 改进
当然上面的写法只是偷懒的写法,实际代码中,应该还添加了一层Repository ,在Repository 层中去 操作DAO,然后通过 ViewModel中的 viewModelScope 协程域 里面去操作 Repository 层中的函数,使用Flow或LiveData跟UI层进行交互,完成整个异步数据库操作。