链接可观察到的RxJava以在Room数据库中添加/创建条目

时间:2019-06-24 12:13:44

标签: android rx-java android-room rx-android

我想要一种使用RxJava搜索和更新Room中现有条目的方法。如果没有记录,则应创建一个新记录。

例如,假设我有以下查询:

@Insert
Single<Long> createContent(Content content);

@Query("SELECT * FROM Content WHERE contentId = :contentId")
Single<Content> searchContent(String contentId);

我目标:

  1. 检查是否有以前的数据并返回其值
  2. 如果没有记录,请创建一个新记录并返回其值

此方法存在的问题:

  1. 无论何时@Query都没有记录,Single<Content>都会直接转到error,而忽略任何 map / flatMap 运算符< / li>
  2. @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);
                    }
                })

1 个答案:

答案 0 :(得分:1)

您可以使用Single.onErrorResumeNext()

daoAccess.searchContent(contentId)
         .subscribeOn(Schedulers.io())
         .map(Resource::success)
         .onErrorResumeNext(throwable ->
             daoAccess.createContent(content)
                      .map(id -> Resource.success(content))
         )