RxJava Single и Room Обработка ошибок Проблема - PullRequest
0 голосов
/ 28 октября 2018

У меня проблема с возвратом пустой базы данных с Room и RxJava Single.Я знаю, что моя база данных пуста, поэтому я ожидаю получить пустой возврат при запуске

@Query("SELECT * FROM Times WHERE timestamp = :timestamp")
fun getTimes(timestamp: String): Single<Times>

Проблема заключается в том, что при вызове этой функции, как показано ниже

timeDao.getTimes("1398332113")
       .observeOn(AndroidSchedulers.mainThread())
       .subscribeOn(Schedulers.io())
       .doOnError { Log.e("Single", "Returned null") }
       .doOnSuccess { result -> times = result}
       .subscribe()

Подписчикдействительно вызывает doOnError метод, подобный

E / Single: возвращено значение NULL

, но все еще возвращается исключение и сбой

W /System.err: io.reactivex.exceptions.OnErrorNotImplementedException: запрос возвратил пустой набор результатов: SELECT * FROM Times WHERE timestamp =?

Я видел очень много похожих вопросов о StackOverflow, но не смог найтиответ.Что я делаю не так?

1 Ответ

0 голосов
/ 28 октября 2018

Первое решение для вашей проблемы.Начиная с версии 2.1.0-alpha01 Room поддерживает тип возврата Maybe, который идеально подходит для моделирования вашей проблемы.

Из документации :

Оператор Maybe работает со следующими последовательнымипротокол: onSubscribe (onSuccess | onError | onComplete)?

Когда ваш элемент находится в db: onSuccess будет вызываться с данными.Если БД пуста, будет вызван onComplete.onError не требует пояснений.

Замена Single на Maybe в классе Dao будет работать.

Дополнительные примечания:

timeDao.getTimes("1398332113")
       .observeOn(AndroidSchedulers.mainThread())
       .subscribeOn(Schedulers.io())
       .doOnError { Log.e("Single", "Returned null") }
       .doOnSuccess { result -> times = result}
       .subscribe()

doOnError

doOnError выполнит лямбду в случае ошибки en, но все равно выдаст ошибку по цепочке.Ваша программа аварийно завершает работу, потому что она не обрабатывает ошибки (subscribe() пусто).

Вы можете сделать subscribe({/* doing nothing for success */}, {e -> Log.e("TAG", "Empty DB")}), чтобы предотвратить сбой.

значение по умолчанию

Если цель состоит в том, чтобы вернуть какое-то значение по умолчанию, если БД пуста, вам нужно будет использовать onErrorReturn, чтобы цепочка продолжалась.Посмотрите этот пост для получения дополнительной информации.

Нулевые значения

Значение по умолчанию не может быть нулевым, спецификация Reactive Streams (RxJava2 реализует его) не поддерживаетне поддерживает нулевые значения.

...