Первое решение для вашей проблемы.Начиная с версии 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 реализует его) не поддерживаетне поддерживает нулевые значения.