Kotlin中结合Room数据库从协程返回变量的方法
解决方法
你的问题核心在于launch启动的协程是异步执行的,函数会直接返回myVal,等协程内的myVal2拿到Room查询结果时,函数早就完成返回了。要返回myVal2,可以用以下两种方案:
方案一:改为挂起函数直接返回结果
1. 修改DAO方法为挂起函数
Room支持挂起函数调用,先给DAO里的查询方法加上suspend修饰:
@Query("SELECT SUM(...) FROM your_table") // 替换成你的实际查询语句 suspend fun getFindTotal(): Double
2. 修改Repository函数为挂起函数
去掉异步的launch,直接调用DAO的挂起方法并返回结果:
suspend fun getFindTotal(): Double { return findDao.getFindTotal() }
3. 在UI层协程中调用
比如在Activity/Fragment用lifecycleScope,或者ViewModel用viewModelScope启动协程获取结果:
lifecycleScope.launch { val total = repository.getFindTotal() // 拿到total后更新UI }
方案二:用Flow监听数据变化(适合需要实时更新的场景)
如果希望数据库数据更新时自动获取最新值,可以让DAO返回Flow:
1. 修改DAO返回Flow
@Query("SELECT SUM(...) FROM your_table") fun getFindTotal(): Flow<Double>
2. Repository直接返回Flow
fun getFindTotal(): Flow<Double> { return findDao.getFindTotal() }
3. 在UI层收集Flow
lifecycleScope.launch { repository.getFindTotal().collect { total -> // 每次数据库数据变化,都会收到最新的total并更新UI } }
内容的提问来源于stack exchange,提问作者OldDogNewTricks
相关产品推荐
相关产品推荐

