Уведомление из Room пустым списком - Flowable из Room
Необходимо получать из репозитория все выбранные объекты (isSelected).
Есть DataRepository - который возвращает Flowable<List<Data>>, данные беру из Room`а:
fun getSelectObjects(): Flowable<List<DataEntity>> //далее мапинг в List<Data>
Знаю, что при отсутствии удовлетворяющих условию записей Flowable из Room ничего не вернет. Какой костыль можно придумать? Более менее нормальный..
Ситуация такая:
Заходим на экран "А", необходимо отобразить выбранные объекты, Flowable ничего не возвращает, все гуд, открываем, условно DrawerMenu и щелкаем чекбокс пару объектов, на экране "А" отобразились объекты, теперь открываем DrawerMenu убираем выделение у объектов, на кране остался один объект..
Ответы (2 шт):
Вы можете записать что-то вроде такого
fun getSelectObjects(): Flowable<List<List<DataEntity>>>
в этом случае вам вернется пустой список списков. Но это конечно костыль и я бы не стал такое писать у себя.
Другой вариант использовать
fun getSelectObjects(): Maybe<List<DataEntity>>
Но правда это по-моему даст вам не совсем то поведение которое вы хотите.
Скорее всего вам лучше написать какую-то прослойку которая будет генерировать вам пустой список если в БД ничего нет, а изменения были.
Можно сделать так:
Room Dao:
@Query("SELECT * FROM Entity WHERE isChecked = 1")
fun getCheckedData(): Flowable<List<Entity>>
@Query("SELECT COUNT(*) FROM Entity WHERE isChecked = 1")
fun getCheckedDataCount(): Flowable<Int>
В репозитории инкапсулируем логику получения данных при изменении состояния выборки.
DataRepository:
fun getSelectData(): Flowable<List<Entity >> {
return dataDao.getCheckedDataCount().switchMap {
if (it > 0)
dataDao.getCheckedData()
else
Flowable.just(emptyList())
}
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
}
В итоге, если в Room есть выбранные записи мы их получаем, а если нет, то получаем пустую коллекцию, а так-же при изменении состояния выборки, репозиторий сообщит об изменениях.