android - 如何使用协同程序在 Room db 中获取插入查询的 ID

标签 android kotlin android-room coroutine

我想在使用协程在 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 模型中保留对上下文的引用。如果您需要上下文,请使用 AndroidViewModelAndroidViewModel#getApplication()

关于android - 如何使用协同程序在 Room db 中获取插入查询的 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61074909/

相关文章:

maven - 像kotlin-gradle-plugin一样,如何将kotlin-js-library更新到1.1.3?

data-structures - 在Kotlin中初始化LongArray的数组

java - iPhone 代码和 Android 代码

android - 从 fragment 调用 startActivityForResult 时出错

android - 想要保护编辑文本不被更改

android - Maybe<List<T>> 在 Room 中的不正确行为?

java - 在 RecyclerView 中显示多个 Room 数据库表中的数据

java - Windows 重新安装后出现 Cordova 错误

android - 从多平台 kotlin 项目访问 C/C++ 库

android - Room 和 rxjava 数据库不工作?