我想要一种使用RxJava搜索和更新Room中现有条目的方法。如果没有记录,则应创建一个新记录。
例如,假设我有以下查询:
@Insert
Single<Long> createContent(Content content);
@Query("SELECT * FROM Content WHERE contentId = :contentId")
Single<Content> searchContent(String contentId);
我目标:
此方法存在的问题:
@Query
都没有记录,Single<Content>
都会直接转到error
,而忽略任何 map / flatMap 运算符< / li>
@Insert
查询返回一个Single<Long>
,但是@Query
返回一个Single<Content>
有什么方法可以从错误中调用并返回新的Observable吗?像这样:
daoAccess.searchContent(contentId)
.subscribeOn(Schedulers.io())
.map(Resource::success)
.onErrorResumeNext(new Function<Throwable, Single<Content>>() {
@Override
public Single<Content> apply(Throwable throwable) throws Exception {
return daoAccess.createContent(contentId);
}
})
答案 0 :(得分:1)
您可以使用Single.onErrorResumeNext()
:
daoAccess.searchContent(contentId)
.subscribeOn(Schedulers.io())
.map(Resource::success)
.onErrorResumeNext(throwable ->
daoAccess.createContent(content)
.map(id -> Resource.success(content))
)