微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在非活动模型中更新 LiveData + Room

如何解决在非活动模型中更新 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] 举报,一经查实,本站将立刻删除。