【问题标题】:Chain a RxJava observable to udpate/create an entry in Room database链接 RxJava 可观察对象以更新/创建 Room 数据库中的条目
【发布时间】:2019-06-24 12:13:44
【问题描述】:

我想要一种使用 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&lt;Content&gt; 就会直接转到error,而忽略任何ma​​p/flatMap 运算符
  2. @Insert 查询返回Single&lt;Long&gt;,但@Query 返回Single&lt;Content&gt;

有什么方法可以从错误中调用并返回一个新的 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);
                    }
                })

【问题讨论】:

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


    【解决方案1】:

    你可以使用Single.onErrorResumeNext():

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

    【讨论】:

    • 我无法从 onErrorResumeNext() 返回 Single,因为第一个观测值返回 Single。请检查更新后的问题。
    • 您注意到onErrorResumeNext 中的map了吗?我发布的代码在类型方面应该是一致的。我只是不知道Resource.success()的返回类型...
    • 我的错,我完全错过了地图操作员。最后一个问题,请建议我为这些不同的 observables 处理错误的最佳方法。
    • 这个问题我不清楚。您是指组合错误还是​​第二个错误?
    • 是的,综合错误。如何捕获任何可观察调用 searchContent() + createContent() 可能发生的任何错误?
    猜你喜欢
    • 2015-01-12
    • 2017-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多