Room数据库新增数据后Compose列表不自动更新问题求助
问题解决:Room添加数据后列表不自动更新
核心问题出在Dao的查询方法没有利用Room自带的Flow监听能力,你现在的Dao方法只做了单次查询,没法感知数据库变化。
具体修改步骤:
- 修改FavouritesDao
把查询方法改成返回Flow<List<FavouriteEntity>>,去掉suspend关键字——Room会自动为返回Flow的查询建立数据库监听:
@Query("SELECT * FROM Favourites") fun getAllFavourite(): Flow<List<FavouriteEntity>>
- 简化CatsRepository的方法
不需要自己手动创建Flow,直接返回Dao的Flow即可,只需要指定调度器:
fun getAllFavourite(): Flow<List<FavouriteEntity>>{ return favouritesDao.getAllFavourite() .flowOn(Dispatchers.IO) }
- ViewModel和UI层无需额外修改
原来的ViewModel里的collect逻辑可以保留,当数据库中Favourites表的数据发生变化(插入、删除、更新)时,Room的Flow会自动发射最新的列表数据,ViewModel收到后更新response.value,Compose UI会自动重组刷新列表。
为什么原来的代码不行?
你之前在Repository里手动创建了一个Flow,只发射了一次Dao查询的结果,之后数据库再变化这个Flow也不会再发射新数据,所以只有重启应用重新查询才能看到更新。而Room原生支持的Flow查询会持续监听数据库变化,一旦数据改变就会推送最新数据。
内容的提问来源于stack exchange,提问作者Sky
相关产品推荐
相关产品推荐

