Estoy creando una aplicación que debería actualizar la lista actual. La implementación se realiza usando room y livedata, estoy usando el patrón mvp sin viewmodel. Mi pregunta es, si tengo una consulta que devuelve todos los elementos en la categoría seleccionada y ya tengo un observable en los datos en vivo, ¿puedo cambiar la función dao con diferentes parámetros de consulta y actualizar la lista en consecuencia? Lo más parecido que he encontrado es: Android Room LiveData seleccionar parámetros de consulta
Pero como soy relativamente nuevo en el desarrollo y actualmente estoy explorando el paradigma reactivo en Android, esto ha resultado ser todo un desafío.
en presentador
override var itemsList: LiveData<List<Item>?> = itemDao.getItemsForCategory(1)en actividad principal
presenter.itemsList.observe(this, Observer { if (it != null) { itemAdapter.setTodoItems(it) itemListHolder.adapter =itemAdapter } })en dao
@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>?>EDITAR (solución)
la solución fue mutableLiveData en la que el valor cambia los parámetros de consulta:
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 } }esta es solo una consulta para la misma categoría, pero con un manejo diferente, todo es posible.
EDITAR (solución)
la solución fue mutableLiveData en la que el valor cambia los parámetros de consulta:
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 } }