gpt4 book ai didi

android - 如何使用数据绑定(bind)库从 Room 数据库观察 LiveData 变化

转载 作者:搜寻专家 更新时间:2023-11-01 09:31:19 27 4
gpt4 key购买 nike

第一次实现 Room 和 Data Binding。

在我的 ViewModel 中:

var numberOfClubs = ObservableInt(0)
private var clubs: LiveData<List<Club>> = clubDao.getAllClubs()

然后我尝试在插入 Room 数据库后获取 clubs.value,但每次都收到 KotlinNullPointerException

fun addClubs() {
Observable.fromCallable({
clubDao.insertClubs(listOf(Club(null, "clubName"))
})
.subscribeOn(schedulerFacade.computation)
.subscribe(
{
numberOfClubs.set(clubs.value!!.size) <--- Kotlin NPE
},
{ error ->
logWrapper.e("MainViewModel", error.message!!)
clubError.set(true)
})
}

在我的 XML 中,我调用:android:text="@{viewModel.numberOfClubs}"

由于插入 Room 数据库不会导致返回任何内容,因此我无法为结果设置 numberOfClubs。我假设 clubs 应该跟踪变化?

最佳答案

是的,正如您已经了解的那样,LiveData 具有生命周期感知能力。这意味着只要 livecycle 所有者在场,它就会进行观察。

即使您已经发布了解决方案,您也不应该使用 !!根本。

viewModel.clubs.observe(this, {
it?.let {
viewModel.numberOfClubs.set(it.size)
}
)

是在分配接收列表的大小之前进行空检查的正确方法。

顺便说一句,如果你想在你的布局中获得项目大小,你应该使用

text="@{viewModel.clubsList.size() + ``}" 

并观察一个列表,而不是使用列表大小

val clubsList = ObservableArrayList<..>() 

viewModel.clubs.observe(this, {
it?.let {
viewModel.clubsList.set(it)
}
)

关于android - 如何使用数据绑定(bind)库从 Room 数据库观察 LiveData 变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47064687/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com