Room数据库数据变更时Kotlin Flow是否会自动发射新数据?
答案
是,满足Room版本要求的前提下,该Kotlin Flow查询会在关联数据变更时自动推送最新结果,具体规则如下:
你贴出的LiveData查询代码遗漏了@Query注解,两份正确的Room查询定义参考:
LiveData 查询
@Query("SELECT IFNULL(COUNT(id),0) FROM Item WHERE status = :status") fun getLiveData(status: Int): LiveData<Int>
Kotlin Flow 查询
@Query("SELECT IFNULL(COUNT(id),0) FROM Item WHERE status = :status") fun getFlowData(status: Int): Flow<Int>
核心行为逻辑
- 该特性从Room 2.2.0版本开始正式支持,返回
Flow类型的可观察查询和上述LiveData查询的触发更新逻辑完全一致:- Room会自动追踪查询语句引用的所有数据表,上述例子中追踪的就是
Item表 - 只要被追踪的表完成增、删、改的事务提交,Room就会自动重新执行对应的查询语句
- Room采用表级失效校验,不会判断变更的数据行是否匹配
WHERE子句的过滤条件,只要表内有数据写入就会触发重查 - 重查完成后,新结果和上一次发射的结果不相等时,Flow才会向下游发射新值;结果完全一致的话不会推送重复数据
- Room会自动追踪查询语句引用的所有数据表,上述例子中追踪的就是
注意事项
- 这个自动更新能力是Room编译时自动实现的,不需要手动编写表变更监听逻辑,直接收集Dao返回的Flow实例即可
- 如果传入的查询参数
status发生变化,原Flow不会自动使用新参数重新查询,这类场景需要借助flatMapLatest等流操作符,将参数变化流和Room查询流做串联,才能拿到参数对应的最新结果 - 不要用额外的
flow{}构造块包裹Dao返回的查询Flow,否则会丢失Room的自动更新能力
内容的提问来源于stack exchange,提问作者Gulab Sagevadiya
相关产品推荐
相关产品推荐

