You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 20:33:28