我注意到很多人和例子使用流作为List<>的包装器,例如:
@Query("SELECT * from some_model ORDER BY some_field")
fun getData(): Flow<List<some_model>>因为我知道流程就像是一种“异步序列”,所以我真的不明白"Flow>“的含义。
为什么我们不能直接使用Flow< T>,这对我来说似乎很直观,我之所以问这个问题,是因为我在代码片段中看到过很多次重复这个问题,不明白它背后的目的??
发布于 2020-07-20 08:52:14
这也是我刚开始使用Flow时问自己的问题。
您可能认为,使用Flow with Room首先会从查询中提取部分数据,使数据在从数据库中获得时通过流可用。这将有效地使用像Flow<T>这样的东西。然而,这不是这里的想法,这更多的是你可以通过Paging得到的东西。
相反,当您调用getData()时,您将获得一个Flow<List<T>>,它将在每次查询结果更改时发出一个完整的新列表,以及一个初始值。SELECT语句总是生成带有房间的列表,而不是单个值。因此,假设您在一个地方收集流:
dao.getData().collect { list ->
Log.d(TAG, list.joinToString())
}然后更改数据库:
dao.insert(...)
dao.insert(...)将写入3条日志消息,一条用于初始值,两条用于后续更改。这一开始可能看起来效率很低(这就是为什么我一开始并不真正理解它的原因),但在实践中,对大多数设备的性能影响可以忽略不计,即使有数千行。当与ListAdapter和DiffUtil结合使用时,它允许一个非常干净的列表实现。
我希望这回答了你的问题。
https://stackoverflow.com/questions/62983215
复制相似问题