【问题标题】:Emit each item from Flowable Room ORM从 Flowable Room ORM 发射每个项目
【发布时间】:2017-06-04 20:54:33
【问题描述】:

我想在 Recycler 视图中显示 Room ORM 中的项目列表。数据正在从网络添加到数据库。问题是每次从Flowable而不是每个项目发出整个列表时我都会得到。我试过 .distinctUntilChanged 没有区别。

@Query("SELECT * FROM items")
Flowable<List<Item>> getItems();

我也尝试只返回一个项目,它只加载第一个是 db 的项目。

【问题讨论】:

  • 您可以使用 flatMap() 从 Flowable> 中获取 Flowable

标签: android rx-java2 android-room


【解决方案1】:

是的,Flowable&lt;List&lt;Item&gt;&gt; 表示当列表更改时您将收到一个回调:这就是 Room 的工作方式。通常,您将该列表传递给DiffUtil,然后它会生成更新您的RecyclerView 所需的一组更改。

【讨论】:

  • 有关DiffUtil 的更多信息,我将从this blog post 开始,即使它不是基于Rx 的。
  • 是的 diff util 应该可以工作。我根据似乎可以工作的项目的 id 使用了一个独特的功能。
  • 强烈考虑将唯一性等属性移动到您的数据库中,而不是将其作为后期处理 - Room 确实支持自动生成 ID 和唯一列
  • 我在数据库中有一个唯一的 ID。问题是它带回了整个表,所以我需要在从数据库检索后过滤它。
  • DiffUtil 需要整个列表 - 它通过将旧列表与新列表进行比较来为您计算添加、删除和更改。如果您总是以相同的方式过滤,那应该在数据库端或您的 Dao 的一部分
【解决方案2】:

您可以使用flatMapFlowable.fromIterable() 映射到Flowable,这将一一发出所有项目

getItems()
    .flatMap(Flowable::fromIterable)
    .subscribe(item -> {

    });

就是这样。简洁干净的代码,无需转换toArray

【讨论】:

    【解决方案3】:

    您可以使用flatMap 获取项目流。

    itemDao.getItems().flatMap(list -> {
          Item[] items = new Item[list.size()];
          list.toArray(items);
          return Flowable.fromArray(items);
        }).subscribe(item -> {
          // Now you can do with each item.
    
        });
    

    如果只需要第一项:

    itemDao.getItems().flatMap(list -> {
              Item[] items = new Item[list.size()];
              list.toArray(items);
              return Flowable.fromArray(items);
            })
             .firstElement()
             .subscribe(first -> {
              // Now you can do with the first one.
    
            });
    

    【讨论】:

    • 正如他在问题中提到的那样,您可以说Flowable&lt;Item&gt; getItems() 仅获取第一项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 1970-01-01
    相关资源
    最近更新 更多