我正在尝试查询Room数据库(操作1),然后根据返回的结果在同一表上执行另一操作。但是我注意到,每次执行第二个操作时,协程都会查询数据库(操作1)。但这不是我想要的。只是一个例子:
我的ItemDao:
@Query("SELECT * FROM item_table")
fun selectItems():Flow<List<Item>>
@Insert
suspend fun insertItem(item:Item)
例如,我想先执行selectItems()
,如果列表为空,请立即致电insertItem(item)
fun insertIfListEmpty(item:Item){
val job=CoroutineScope(IO).launch {
itemDao.selectItems().collect{
log.d(TAG,"items collected")
if (it.isNullOrEmpty()) {
itemDao.insertItem(item)
}
}
}
}
但是在itemDao.insertItem(item)
之后它再次显示日志消息。即使我再次从另一种方法调用itemDao.insertItem(item)
,它也会显示日志消息。收集后有什么办法可以取消对协程的订阅?