Одноразовый запрос единый результат в Room Android

Я отрабатываю свои навыки работы с Android (новичок), создавая приложение со списком покупок. У меня есть две таблицы в моей базе данных, таблица shopping_item (элементы, которые я хочу купить) и таблица reference_item (элементы, которые я знаю, категорию и цену за единицу). Каждый раз, когда я добавляю товар для покупок, появляется поле refId, ссылающееся на соответствующий идентификатор ссылочного товара. Это значение по умолчанию для эталонного товара по умолчанию, если на товар еще нет ссылки.

Я использую модель MVVM. Затем у меня есть DAO, repository, viewModel и мой fragments, которые отображают данные.

Когда я добавляю новый товар, я хочу знать, есть ли соответствующий ссылочный товар. Я хочу сделать следующее Query:

@Query(value = "SELECT refId FROM reference_items WHERE reference_item_name = :refName")
suspend fun getRefItem(refName : String) : Int

Он возвращает идентификатор ссылочного элемента, соответствующий как Int, или имеет значение NULL, если на него еще нет ссылки. В моем репозитории есть такая функция:

suspend fun getRefItem(refName : String) = db.getShoppingDao().getRefItem(refName)

На данный момент я думаю, что у меня все в порядке. Думаю, ошибки не было видно.

Проблема начинается, когда я пытаюсь реализовать свой viewModel. Что я должен делать? А как насчет моего fragment?

В моем fragment есть addNewItem(name: String, amount: Int) функция для добавления нового элемента. Я могу найти справочный элемент, соответствующий предоставленному name.

Я пробовал несколько вещей, используя LiveData, suspend функции, _18 _ / _ 19_, но сейчас я заблудился. Во всех руководствах или примерах используется LiveData или запрашивать все данные из базы данных. Я просто хочу один Integer, один раз, я думаю, нет необходимости в LiveData.


person Francky380    schedule 19.05.2020    source источник


Ответы (1)


вот полное решение. Надеюсь, это будет полезно для вас.

DAO

@Query(value = "SELECT refId FROM reference_items WHERE reference_item_name = :refName")
suspend fun getRefItem(refName : String) : Int

Репозиторий

// Specify return datatype as Int
suspend fun getRefItem(refName : String): Int = db.getShoppingDao().getRefItem(refName)

ViewModel

fun getRefItem(name: String): LiveData<Int> {
   val result : MutableLiveData<Int>()  <-- setup livedata to return as value
   viewModelScope.lanuch {
      result.postValue(repository.getRefItem(name))
   }
   return result  <-- return livedata
}

Фрагмент

fun addNewItem(name: String, amount: Int) {
   // setup viewModel observer
   viewModel.getRefItem(name).observer { viewLifecycleOwner, { value ->
         // GET YOUR INT VALUE HERE 
         Log.i("VALUE", value) 
      }

   }
}

person Teo    schedule 12.01.2021