RoomDb查询返回空值

时间:2020-02-23 08:45:26

标签: android kotlin android-room kotlin-coroutines

我正在查询我的房间数据库以检查是否存在某项,但是即使该项已在数据库中,查询也始终返回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")
    }

1 个答案:

答案 0 :(得分:1)

我认为您缺少有关使用协程的一些基本知识。

  1. 您的数据库查询是一个暂停方法,它将执行并执行“ suspend ”,直到返回。
  2. 由于您的存储库功能仍挂起,因此您可以将其提供给用户以在哪个范围上运行。
  3. 这时出现LiveData问题,您在itemCount仍然为空的情况下登录。触发器从未执行过,即使执行了,也不会执行您的log语句。
  4. 您的视图模型使用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)
}

建议阅读内容