将 RxJava observable 链接到 udpate/create Room 数据库中的条目
Chain a RxJava observable to udpate/create an entry in Room database
我想要一种使用 RxJava 搜索和更新 Room 中现有条目的方法。如果没有记录,它应该创建一个新记录。
例如,假设我有以下查询:
@Insert
Single<Long> createContent(Content content);
@Query("SELECT * FROM Content WHERE contentId = :contentId")
Single<Content> searchContent(String contentId);
我的目标:
- 检查是否有以前的数据和return它的值
- 如果没有记录创建一个新记录并且return它的值
这种方法的问题:
- 只要没有来自
@Query
的记录,Single<Content>
就会直接转到 error
,忽略任何 map/ flatMap 运算符
@Insert
查询 return 是 Single<Long>
但 @Query
return 是 Single<Content>
有什么方法可以从错误中调用并 return 一个新的 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))
)
我想要一种使用 RxJava 搜索和更新 Room 中现有条目的方法。如果没有记录,它应该创建一个新记录。
例如,假设我有以下查询:
@Insert
Single<Long> createContent(Content content);
@Query("SELECT * FROM Content WHERE contentId = :contentId")
Single<Content> searchContent(String contentId);
我的目标:
- 检查是否有以前的数据和return它的值
- 如果没有记录创建一个新记录并且return它的值
这种方法的问题:
- 只要没有来自
@Query
的记录,Single<Content>
就会直接转到error
,忽略任何 map/ flatMap 运算符 @Insert
查询 return 是Single<Long>
但@Query
return 是Single<Content>
有什么方法可以从错误中调用并 return 一个新的 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))
)