我正在查询我的房间数据库以检查是否存在某项,但是即使该项已在数据库中,查询也始终返回null。我正在使用协程
这是我的查询
@Query("SELECT EXISTS(SELECT * FROM cart_item WHERE productId = :productId)")
suspend fun getItemCount(productId: Int): Int?
我的存储库中的函数
suspend fun getCartItemCount(productId: Int): Int? {
return coroutineScope{
cartItemDao.getItemCount(productId)
}
}
在我的视图模型中
fun getCartItemCount(productId: Int): MutableLiveData<Int>? {
var itemCount: MutableLiveData<Int>? = MutableLiveData()
launch {
itemCount!!.value = repository.getCartItemCount(productId)
}
return itemCount
}
这就是我在片段中实现它的方式
fun getCartItemCount(productId: Int){
var itemCount: Int? = null
mainViewModel!!.getCartItemCount(productId)!!.observe(viewLifecycleOwner, Observer {
itemCount = it
})
Log.d("ITEMCOUNT ----> ", " $itemCount")
}
答案 0 :(得分:1)
我认为您缺少有关使用协程的一些基本知识。
itemCount
仍然为空的情况下登录。触发器从未执行过,即使执行了,也不会执行您的log语句。您的视图模型使用LiveData
发布更改,那么您是否需要在您的方法上返回一个值?
建议的更改
存储库
// repository
suspend fun getCartItemCount(productId: Int): Int? {
return cartItemDao.getItemCount(productId)
}
查看模型
var itemCount: MutableLiveData<Int> = MutableLiveData()
// maybe rename method as it's not a getter anymore
fun getCartItemCount(productId: Int) {
viewModelScope {
itemCount.value = repository.getCartItemCount(productId)
}
}
在您的片段中
fun getCartItemCount(productId: Int){
mainViewModel?.observe(viewLifecycleOwner, Observer {
itemCount = it
// this will be triggered every time the "LiveData.value" changes
// this could return null if the live data value is not set.
Log.d("ITEMCOUNT", "$it")
})
mainViewModel?.getCartItemCount(productId)
}
建议阅读内容: