如何解决在非活动模型中更新 LiveData + Room
我有一个 片段 A(包含一个带有项目的 recyclerView)和一个 viewmodel,其中包含 LiveData 属性的 房间数据库。
像这样:
val allItems: LiveData<List <Item>> = repo.getAll()
如果我从片段 A 打开一个新片段(我们称之为 B)并在那里执行 repo.insert(item)
,我希望 LiveData 的观察者在返回片段 A 时触发 allItems
。但这并没有不会发生。
如何才能很好地修复它?
当然每次打开片段A都可以在onViewCreated()
中获取数据,但我相信一定有更好的方法。
class Charactersviewmodel : Baseviewmodel() {
private val db get() = AppDatabase.getDB(MyApplication.application)
private val repo = CharacterRepository(viewmodelScope,db.characterDao())
val characters: LiveData<List<Character>> = repo.getAll()
}
class CharacterRepository(
private val scope: Coroutinescope,private val dao: CharacterDao
) {
fun getAll() = dao.getAll()
fun getById(itemId: Int) = dao.getById(itemId)
fun insert(item: Character) = scope.launch {
dao.insert(item)
}
fun update(item: Character) = scope.launch {
dao.update(item)
}
fun delete(item: Character) = scope.launch {
dao.delete(item)
}
}
@Dao
interface CharacterDao {
fun getAll(): LiveData<List<Character>>
fun getById(itemId: Int) : LiveData<Character>
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert(item: Character)
@Update(onConflict = OnConflictStrategy.REPLACE)
suspend fun update(item: Character)
@Delete
suspend fun delete(item: Character)
}
注意:看起来这是因为 Fragment A 的 viewmodel 当前处于非活动状态。并且该问题不是由 viewLifecycleOwner 引起的,因为也没有通知 observeForever。
更新:刚刚发现问题,附上答案。
解决方法
获取数据库实例时有。
fun getDB(appContext: Context) = Room.databaseBuilder(
appContext,AppDatabase::class.java,DB_NAME
).build()
我通过使其成为单例解决了这个问题,所以现在它返回相同的数据库实例。
companion object {
@Volatile
private var INSTANCE: AppDatabase? = null
@Synchronized
fun getDB(context: Context): AppDatabase {
// if the INSTANCE is not null,then return it,otherwise create the database
return INSTANCE ?: run {
val instance = Room.databaseBuilder(
context.applicationContext,DB_NAME
).build()
INSTANCE = instance
instance
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。