我们可以将Flowable
设置为在准备就绪时发出每个项目,但将其附加到列表中(类似于buffer(int size)
但没有明确的功能) 我对返回Flowable <List <ItemEntity>>
的数据库进行搜索查询,然后将每个ItemEntity
映射到一个ItemDomain
,它返回一个Flowable <List <ItemDomain>>
。Flowable <List <ItemDomain>>
是否可以按顺序返回值,而无需等待整个结果(即首先是一个项目列表,然后是一个两个项目列表,然后是一个三个项目列表等)。 当我更改搜索查询时,我希望再次收到新列表。
override fun observeGroupsBySearchQuery(query: String): Flowable<List<Group>> {
return groupsDao.observeGroupsBySearchQuery(query)
.switchMap {
Flowable.fromIterable(it)
.map { group ->
Group(group.symbol, group.number, group.name)
}
.toList() // I dont want to wait until finish, but I dont want to loose earlier emitted items
.toFlowable()
}
}
@Query(
value = """
SELECT *
FROM Groups
WHERE symbol || number || name LIKE '%' || :query || '%' AND number != -1 AND active IS 1
""")
abstract fun observeGroupsBySearchQuery(query: String): Flowable<List<GroupsEntity>>
另一个有趣的问题是数据库(房间)是否可以一个接一个地返回结果(我们必须为此使用pagination
)?
听起来你需要scan
来接收中间聚合:
groupsDao.observeGroupsBySearchQuery(query)
.switchMap(it ->
Flowable.fromIterable(it)
.map(group -> Group(group.symbol, group.number, group.name))
.scan(new ArrayList<>(), (state, t) -> { state.add(t); return state; })
.skip(1)
)
如果您计划在不同的线程上使用中间列表,则必须每次都制作一份副本:
.skip(1)
.map(list -> new ArrayList<>(list))