当前位置: 首页 > 知识库问答 >
问题:

RxJava:将可观察到的拆分为两个列表

尹辰沛
2023-03-14

使用:我必须更新存储在本地数据库中的当前订单。步骤如下:

  1. 从后端下载数据(~800项)
  2. 检查本地数据库是否已包含项。后端人员使用字符串作为主键。
  3. 如果该项不在数据库中,请添加它。
  4. 如果该项在数据库中,请更新它。
Observable<List<OrderDto>> getAllOrdersObservable = backendService.getAllOrders();

ordersDisposable = Observable.combineLatest(getStoredOrder(), getAllOrdersObservable, this::insertOrUpdateOrders)
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .doOnComplete(() -> {
            Log.d(TAG, "Duration: " + (System.currentTimeMillis() - start) + " ms");
            showSyncButton();
            notifyListenersDataDownloaded();
        })
        .subscribe();


private Observable<List<Order>> getStoredOrder() {
    return Observable.defer(() -> {
        Log.d(TAG, "Started loading orders from database");
        Observable<List<Order>> just = Observable.just(orderDao.loadAll());
        Log.d(TAG, "Ended loading orders from database");
        return just;
    });
}

private List<Order> insertOrUpdateOrders(List<Order> orders, List<OrderDto> orderDtos) {
    List<Order> ordersToInsert = new LinkedList<>();
    List<Order> ordersToUpdate = new LinkedList<>();

    for (OrderDto orderDto : orderDtos) {
        Order order = getOrderByOrderNumber(orders, orderDto.getNumber());
        if (order != null) {
            dtoToEntityTransformer.updateFields(orderDto, order);
            ordersToUpdate.add(order);
        } else {
            order = dtoToEntityTransformer.transformToEntity(orderDto);
            ordersToInsert.add(order);
        }
    }

    orderDao.insertInTx(ordersToInsert);
    orderDao.updateInTx(ordersToUpdate);

    return orders;
}

问题

你有一个如何用反应的方式解决这个问题的想法吗?有没有一个运算符,允许把可观察到的东西分成两个列表。或者我应该使用一个全局变量(似乎不是一个好主意)来保存信息,哪些数据要插入,哪些要更新?

共有1个答案

钱锐
2023-03-14

使用groupby,关键是它是否是更新/插入操作;您将得到一个包含密钥的GroupedObservable。使用该键执行适当的操作。

 类似资料:
  • 问题内容: 给定汽车清单(),我可以这样做: 有没有办法我可以从一个到一个序列? 像没有参数的东西 问题答案: 您可以这样映射到: 请注意,flatMapping可能不会保留源可观察的顺序。如果订单对您很重要,请使用。

  • 我正在尝试开发我的第一个RxJava例子 我有一个带有文本框和三个按钮的主要活动。第一个按钮初始化单独类中的整数。第二个按钮订阅一个可观察量,该可观察量假定正在观察整数。第三个按钮将整数的值减小 1。 这是我的密码 和班级 当我尝试使用 订阅时,它只是给了我 的值(即 6),然后它给了我完成! 然后我尝试使用,认为我需要使用,只是而不是,但后来我得到了一个返回的空的,然后再次完成! 有人能帮助我从

  • 我需要将另一个改装请求中的图像合并到其特定系列中。听起来很简单的任务把我带进了反应式的地狱,没有一丝希望。 具体来说,我还通过可观察创建服务,因为我需要获取身份验证令牌来创建服务。 我的尝试基于以下答案:https://stackoverflow.com/a/28418503/2192545. 我有点不知所措。我只是在Observable的Func2部分得到了“无法推断函数接口类型”。在IDE中,

  • 我正在从事一个涉及Hystrix的项目,我决定使用RxJava。现在,忘记Hystrix的其余部分,因为我相信主要问题是我完全搞砸了正确编写可观察代码。 需要:我需要一种方法来返回一个代表多个可观察对象的可观察对象,每个可观察对象都运行一个用户任务。我希望该可观察对象能够返回任务的所有结果,甚至错误。 问题:可观测流会因错误而消亡。如果我有三个任务,而第二个任务引发了一个异常,那么即使第三个任务成

  • 我有一个id列表,并且有一个方法,它接受id并返回可观察的 假设我有用户id(1),我需要使用此方法更新他的配置文件