3

使用sqlbrite时,使用groupBy()后无法使用rxjava函数toList()。这是我的代码:

QueryObservable query = jetAnywhereDB.createQuery(Item.TABLE, "SELECT * FROM testTable");
query.flatMap(q -> {
  return q.asRows(Item.MAPPER);
}).
groupBy(item -> {
  return Character.toUpperCase(item.name.charAt(0));
}).
subscribe(groupedObservable -> {
  groupedObservable.subscribe(item -> {
    Log.d("test", groupedObservable.getKey() + ": " + item.name);
  });
});

这可以正常工作并在所有项目发出时记录它们,但是如果我将其更改为

groupedObservable.toList().subscribe(items -> {
    Log.d("test", groupedObservable.getKey() + ": " + items);
  });

我没有正确使用 toList() 吗?这可能是因为 sqlbrite 流没有结束,所以 rxjava 在完成 toList() 之前等待更多项目发出?

4

1 回答 1

1

groupBy是一种特殊的运算符,要求您订阅返回的,GroupedObservable否则它不会请求更多数据并会挂起。在您的第一个示例中,您执行此操作,但在第二个示例中,您开始累积组而不订阅它们。

您可以做的是flatMap将组 ping 成一对密钥和列表,这样它就不会挂起:

.groupBy(t -> ...)
.flatMap(g -> g.toList().map(lst -> Pair.of(g.getKey(), lst)))
.subscribe(...)

我不熟悉 SQLBrite,但它确实是一个不完整的源toList应用到它永远不会发出任何东西(无论是否有groupBy)。

于 2015-10-20T10:29:15.500 回答