【问题标题】:Inserting many entities one by one一个一个地插入许多实体
【发布时间】:2021-12-27 17:55:07
【问题描述】:

我想插入很多行,但要一一插入 - 不是批量:

    var setOrder = 0        
       for (exercise in exercisedWithSetsDTO) {
            viewModelScope.launch {
                var training = TrainingExercise(
                    trainingId,
                    exercise.id,
                    exercise.setNo
                )

                var trainingId = trainingDao.insert(training)

                for (i in 1..training.setsNumber) {
                    setDao.insert(SetEntity(trainingId.toInt(), setOrder))
                    setOrder++
                }
            }
        }

"var trainingId = trainingDao.insert(training)" - 直到那一刻它才起作用。已添加所有培训。

问题是

             for (i in 1..training.setsNumber) {
                    setDao.insert(SetEntity(trainingId.toInt(), setOrder))
                    setOrder++
                }

不工作。没有向 db 插入任何内容。

我认为问题是因为我尝试在“var trainingId = trainingDao.insert(training)”完成之前执行“setDao.insert(SetEntity(trainingId.toInt(), setOrder))”,但我不确定并且不知道怎么解决。

以前我在添加培训时遇到问题,但是当我将 viewModelScope.launch 移​​到“for”中时,至少添加培训是可行的 - 我不确定这是否是正确的方法,或者我只是“破解”了我的问题

【问题讨论】:

  • 我设法解决了这个问题。答案很简单,但不确定我是否应该这样做,即使它正在工作。我将“viewModelScope.launch {”移到第一个循环之外并添加了“runBlocking”

标签: android android-room kotlin-coroutines


【解决方案1】:

尝试使用 async-await,如下所示

        viewModelScope.launch {
        var training = TrainingExercise(
            trainingId,
            exercise.id,
            exercise.setNo
        )

        var tId = async { trainingDao.insert(training) }
        val trainingId  = tId.await()
        for (i in 1..training.setsNumber) {
            setDao.insert(SetEntity(trainingId.toInt(), setOrder))
            setOrder++
        }
    }

async 将返回一个延迟值,.await() 将等待异步完成

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    相关资源
    最近更新 更多