我有这个问题的空数据库返回房间和RxJava单。我知道我的数据库是空的,所以我希望在触发时得到一个空的返回
@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
但仍返回异常和崩溃
io.reactivex.exceptions.OnErrorNotImplementedException: W/System.err:
查询返回空结果集: SELECT * FROM timestamp =?
我在StackOverflow上看到过很多类似的问题,但都找不到答案。我做错了什么?
发布于 2018-10-29 01:32:30
首先是你的问题的解决方案。从版本开始,2.1.0-alpha01
房间支持Maybe
返回类型,它非常适合建模您的问题。
可能使用以下顺序协议运行:onSubscribe (onSuccess | onError | onComplete)?
当您的项目在db中时,将使用数据调用onSuccess
。如果db为空,将调用onComplete
。onError
是不言自明的。
在Dao类中用Maybe
替换Single
是可行的。
进一步说明:
timeDao.getTimes("1398332113")
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.io())
.doOnError { Log.e("Single", "Returned null") }
.doOnSuccess { result -> times = result}
.subscribe()
doOnError
doOnError
将在en错误的情况下执行lambda,但它仍然会沿着链向下发出错误。您的程序崩溃是因为它不处理错误( subscribe()
为空)。
您可以使用subscribe({/* doing nothing for success */}, {e -> Log.e("TAG", "Empty DB")})
来防止崩溃。
默认值
如果目标是在DB为空的情况下返回一些默认值,那么您将希望使用onErrorReturn
,以便链继续。有关更多信息,请查看this blog post。
空值
默认值不能为null,Reactive Streams规范(RxJava2实现它)不支持NULL值。
https://stackoverflow.com/questions/53027950
复制相似问题