Room + LiveData динамически изменяют функцию запроса - PullRequest
0 голосов
/ 04 февраля 2019

Я создаю приложение, которое должно обновлять текущий список.Реализация выполняется с использованием room и livingata, я использую шаблон mvp без viewmodel.Мой вопрос заключается в том, что если у меня есть запрос, который возвращает все элементы в выбранной категории, и у меня есть наблюдаемая, уже существующая в данных, могу ли я изменить функцию dao с другими параметрами запроса и соответствующим образом обновить список.Самая близкая вещь, которую я нашел, это: Android Room LiveData select параметры запроса

, но, поскольку я относительно новичок в разработке и в настоящее время изучаю реактивную парадигму в Android, это имеетоказалось довольно сложной задачей.

в докладчике

override var itemsList: LiveData<List<Item>?> = 
itemDao.getItemsForCategory(1)

в основной деятельности

presenter.itemsList.observe(this, Observer {
    if (it != null) {
        itemAdapter.setTodoItems(it)
        itemListHolder.adapter =itemAdapter
    }
})

в дао

@Query("SELECT * FROM Item")
fun getItemsFromDatabase(): LiveData<List<Item>?>

@Query("SELECT * FROM Item WHERE category_id == :category_id ORDER BY 
creationTime ASC")
fun getItemsForCategory(category_id: Long): LiveData<List<Item>?>

РЕДАКТИРОВАТЬ (решение)

решение было mutableLiveData, в котором значение изменяет параметры запроса:

override var itemsList: LiveData<List<IItem>?> = Transformations.switchMap(mutableLiveData) {
    itemDao.getItemsForCategory(mutableLiveData.value!!.toLong())
}

override fun onItemsCalled(categoryId: Long) {
    when (mutableLiveData.value) {
        1 -> mutableLiveData.value = 2
        2 -> mutableLiveData.value = 3
        3 -> mutableLiveData.value = 4
        4 -> mutableLiveData.value = 1
    }
}

это просто запрос для той же категории, но с другой обработкой все возможно.

1 Ответ

0 голосов
/ 05 февраля 2019

РЕДАКТИРОВАТЬ (решение)

решение было mutableLiveData, в котором значение изменяет параметры запроса:

override var itemsList: LiveData<List<IItem>?> = Transformations.switchMap(mutableLiveData) {
itemDao.getItemsForCategory(mutableLiveData.value!!.toLong())
}

override fun onItemsCalled(categoryId: Long) {
    when (mutableLiveData.value) {
        1 -> mutableLiveData.value = 2
        2 -> mutableLiveData.value = 3
        3 -> mutableLiveData.value = 4
        4 -> mutableLiveData.value = 1
    }
}
...