Room查询返回的Flow首次发射值,插入数据后不再发射问题
问题解决:Room中判断表是否为空的Flow插入数据后不更新
问题根源
Room的Flow查询靠监听表的行变更事件触发重新执行。你当前用的SELECT EXISTS(...)属于聚合计算查询,Room无法自动关联到weather_location表的行变化,所以插入数据后不会触发Flow发射新值。
两种可行解决方案
方案1:显式指定监听的表
在@Query注解中添加NOTIFY ON语法,强制Room监听weather_location表的所有数据变更(插入/更新/删除),一旦表有变化就重新执行查询:
@Query("SELECT EXISTS(SELECT 1 FROM weather_location) NOTIFY ON weather_location") fun checkIfTableEmpty(): Flow<Boolean>
方案2:查询表的总行数(更直观)
改用查询总行数的方式,Room会自动为这类基于行数量的聚合查询关联表的变更通知,不需要额外配置:
Dao层修改:
@Query("SELECT COUNT(*) FROM weather_location") fun getTableRowCount(): Flow<Int>
UseCase层修改:
class WeatherLocationsEmptyUseCase @Inject constructor( private val locationRepository: LocationRepository ) { operator fun invoke(): Flow<TableState> { return locationRepository.getTableRowCount().map { rowCount -> if (rowCount > 0) TableState.NotEmpty else TableState.Empty } } }
注意事项
- 使用
NOTIFY ON时,必须确保指定的表名和数据库中实际表名完全一致,大小写敏感(取决于你的数据库配置)。 - 两种方案都能解决问题,选择哪种取决于你的代码习惯,总行数的方式可读性更强。
内容的提问来源于stack exchange,提问作者Ansh T
相关产品推荐
相关产品推荐

