android - 链接 RxJava 可观察对象以在 Room 数据库中更新/创建条目
问题描述
我想要一种使用 RxJava 搜索和更新 Room 中现有条目的方法。如果没有记录,则应创建一个新记录。
例如,假设我有以下查询:
@Insert
Single<Long> createContent(Content content);
@Query("SELECT * FROM Content WHERE contentId = :contentId")
Single<Content> searchContent(String contentId);
我的目标:
- 检查是否有以前的数据并返回其值
- 如果没有记录,则创建一个新记录并返回它的值
这种方法的问题:
- 每当没有记录 from
@Query
时,Single<Content>
直接error
忽略任何map / flatMap运算符 @Insert
查询返回 a但Single<Long>
返回@Query
aSingle<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);
}
})
解决方案
你可以使用Single.onErrorResumeNext()
:
daoAccess.searchContent(contentId)
.subscribeOn(Schedulers.io())
.map(Resource::success)
.onErrorResumeNext(throwable ->
daoAccess.createContent(content)
.map(id -> Resource.success(content))
)