2015-10-20 39 views
3

当我使用sqlbrite时,在使用groupBy()后我不能使用rxjava函数toList()。这里是我的代码:使用groupBy和toList rxjava函数和sqlbrite

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); 
    }); 
}); 

这工作正常,并记录所有的项目,因为他们得到发出的,但如果我不是我()正确使用toList将其更改为

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

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

回答

1

groupBy是一种特殊的操作符,需要您订阅返回的GroupedObservable,否则它不会请求更多数据并挂起。在你的第一个例子中,你这样做了,但是在第二个例子中,你开始累积组而不订阅它们。

你可以做的是flatMap坪组成一对密钥和列表,所以它不会挂起:

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

我不熟悉SQLBrite但它是真实未完源与toList适用于它将永远不会发射任何东西(无论是否有groupBy或不)。

+0

所以它看起来像onComplete从来没有要求sqlbrite(https://github.com/square/sqlbrite/issues/36)。在这种情况下有没有办法使用groupBy? –

+1

如果你使用'groupBy',那么是,但'toList'不起作用。你必须通过'timeout()'来停止源代码,或者使用time-bound'buffer()'代替'toList'。 – akarnokd

+0

应该接受答案。有时候冷热的东西是痛苦的 –