Уведомление из Room пустым списком - Flowable из Room

Необходимо получать из репозитория все выбранные объекты (isSelected). Есть DataRepository - который возвращает Flowable<List<Data>>, данные беру из Room`а:

fun getSelectObjects(): Flowable<List<DataEntity>> //далее мапинг в List<Data>

Знаю, что при отсутствии удовлетворяющих условию записей Flowable из Room ничего не вернет. Какой костыль можно придумать? Более менее нормальный..

Ситуация такая:

Заходим на экран "А", необходимо отобразить выбранные объекты, Flowable ничего не возвращает, все гуд, открываем, условно DrawerMenu и щелкаем чекбокс пару объектов, на экране "А" отобразились объекты, теперь открываем DrawerMenu убираем выделение у объектов, на кране остался один объект..


Ответы (2 шт):

Автор решения: Sergei Buvaka

Вы можете записать что-то вроде такого

fun getSelectObjects(): Flowable<List<List<DataEntity>>> 

в этом случае вам вернется пустой список списков. Но это конечно костыль и я бы не стал такое писать у себя.

Другой вариант использовать

fun getSelectObjects(): Maybe<List<DataEntity>> 

Но правда это по-моему даст вам не совсем то поведение которое вы хотите.

Скорее всего вам лучше написать какую-то прослойку которая будет генерировать вам пустой список если в БД ничего нет, а изменения были.

→ Ссылка
Автор решения: Ilnar

Можно сделать так:

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 есть выбранные записи мы их получаем, а если нет, то получаем пустую коллекцию, а так-же при изменении состояния выборки, репозиторий сообщит об изменениях.

→ Ссылка