如何使用协程获取 Room 数据库中插入查询的 ID

San*_*inh 3 android coroutine kotlin android-room

我想在使用协程在 Roomdb 中成功插入数据时得到回调


MyDao.kt

@Dao
interface MyDao {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insert(obj: Task): Long
}
Run Code Online (Sandbox Code Playgroud)


任务视图模型.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)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如何mIDinsertTask()方法返回?

提前谢谢你

Som*_*boy 7

用 包装调用 withContext并将函数标记为挂起

suspend insertTask(task: Task) = withContext(Dispatchers.IO) { appDao.insertTask(task) }
Run Code Online (Sandbox Code Playgroud)

从你的角度来看:

fun saveTask(t: Task) = lifecycleScope.launch {
    val id = viewModel.insertTask(t)
    Toast.makeText(context, "Task $id has been inserted", Toast.LENGTH_SHORT).show()
}
Run Code Online (Sandbox Code Playgroud)

您还可以返回一个LiveData在完成时触发回调的函数:

fun insertTask(task: Task): LiveData<Long> {
    val liveData = MutableLiveData<Long>()
    viewModelScope.launch {
        liveData.value = dao.insertTask(task)
    }
    return liveData
}
Run Code Online (Sandbox Code Playgroud)

进一步建议

不要在视图模型中保留对上下文的引用。如果您需要上下文使用AndroidViewModelAndroidViewModel#getApplication()