我想在使用协程在 Roomdb 中成功插入数据时获得回调
MyDao.kt
@Dao
interface MyDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insert(obj: Task): Long
}
TaskViewModel.kt
class TaskViewModel(var context:Context) : ViewModel{
private var appDao: AppDao
init {
val db = AppDatabase.getInstance(context)
appDao = db.appDao()
}
fun insertTask(tast: Task) {
GlobalScope.launch {
val mID = appDao.insert(task)
}
}
}
如何从 insertTask()
方法返回 mID
?
提前致谢
最佳答案
用 withContext
包装调用并将函数标记为挂起
suspend insertTask(task: Task) = withContext(Dispatchers.IO) { appDao.insertTask(task) }
从你的角度来看:
fun saveTask(t: Task) = lifecycleScope.launch {
val id = viewModel.insertTask(t)
Toast.makeText(context, "Task $id has been inserted", Toast.LENGTH_SHORT).show()
}
您还可以返回一个 LiveData
,它会在完成时触发回调:
fun insertTask(task: Task): LiveData<Long> {
val liveData = MutableLiveData<Long>()
viewModelScope.launch {
liveData.value = dao.insertTask(task)
}
return liveData
}
进一步的建议
不要在 View 模型中保留对上下文的引用。如果您需要上下文,请使用 AndroidViewModel
和 AndroidViewModel#getApplication()
关于android - 如何使用协同程序在 Room db 中获取插入查询的 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61074909/