如何配置包含自定义数据类数组的Room数据库并适配LiveData存储
Room离线缓存实现方案
1. 引入Room依赖
在模块级build.gradle文件中添加如下依赖(版本可根据实际需求调整):
plugins { id 'com.android.application' id 'org.jetbrains.kotlin.android' id 'kotlin-kapt' // 必须开启kapt注解处理 } dependencies { implementation "androidx.room:room-runtime:2.5.0" kapt "androidx.room:room-compiler:2.5.0" implementation "androidx.room:room-ktx:2.5.0" }
2. 定义Room实体类
Room不支持直接将继承自集合的House类作为表实体,我们将单个HouseItem作为数据表的行存储,给HouseItem添加Room实体注解:
@Entity(tableName = "house_items") data class HouseItem( @PrimaryKey(autoGenerate = true) val id: Int = 0, // 新增自增主键 val actor: String, val house: String, val image: String, val name: String ) // 原有House类保持不变即可 class House : ArrayList<HouseItem>()
3. 定义DAO数据访问接口
定义增查方法,支持返回LiveData类型的查询结果:
@Dao interface HouseDao { // 查询所有HouseItem,返回LiveData包裹的列表 @Query("SELECT * FROM house_items") fun queryAllHouseItems(): LiveData<List<HouseItem>> // 批量插入HouseItem,缓存数据用 @Insert(onConflict = OnConflictStrategy.REPLACE) suspend fun insertHouseItems(items: List<HouseItem>) }
4. 定义Room数据库类
@Database(entities = [HouseItem::class], version = 1, exportSchema = false) abstract class AppDatabase : RoomDatabase() { abstract fun houseDao(): HouseDao companion object { // 单例实现按常规Room单例写法即可,此处省略 } }
5. 转换查询结果并赋值给目标LiveData
因为House是ArrayList<HouseItem>的子类,只需要将查询到的List<HouseItem>转换为House类型即可,有两种常用实现方式:
方式1:使用Transformations自动转换
// 初始化DAO实例后 val houseLiveData : MutableLiveData<House> = Transformations.map(houseDao.queryAllHouseItems()) { itemList -> House().apply { addAll(itemList) } } as MutableLiveData<House>
方式2:手动查询后赋值
// 在协程中执行同步查询后赋值 viewModelScope.launch { // 需先在DAO中新增同步查询方法:@Query("SELECT * FROM house_items") suspend fun queryAllHouseItemsSync(): List<HouseItem> val itemList = houseDao.queryAllHouseItemsSync() val house = House().apply { addAll(itemList) } houseLiveData.postValue(house) }
内容的提问来源于stack exchange,提问作者zain mahmood
相关产品推荐
相关产品推荐

