RoomDb Query Возвращает ноль - PullRequest
0 голосов
/ 23 февраля 2020

Я запрашиваю мою базу данных комнаты, чтобы проверить, существует ли элемент, однако запрос всегда возвращает ноль, даже если элемент уже находится в БД. Я использую сопрограммы

Это мой запрос

@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 Ответ

1 голос
/ 23 февраля 2020

Я думаю, что вам не хватает некоторых принципов использования сопрограмм.

  1. Ваш запрос к базе данных - это метод приостановки, который будет выполняться и " приостановить " выполнение tge до тех пор, пока не вернется .
  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)
}

Рекомендуемое чтение:

...