如何使用 kotlin 协程查询房间数据库?

How to query room database using kotlin coroutines?

我有以下数据table

@Entity(tableName = "day_table")
data class DayData(
    @PrimaryKey(autoGenerate = true)
    var dayID: Long =0L,
    @ColumnInfo(name = "step_date")
    var stepDate : String = "" ,
    @ColumnInfo(name = "step_count")
    var stepCount : Int = 0,
    @ColumnInfo(name = "step_goal")
    var stepGoal : Int = 0
)

在我的道里我有

    @Insert
    fun insert(day: DayData)

    @Update
    fun update(day: DayData)

    @Query("SELECT EXISTS(SELECT * FROM day_table WHERE step_date = :queryDate)")
    suspend fun doesDayExist(queryDate:String) : Boolean

在视图模型中 class 我有:

 private fun initDay(){
        //check if this day is in the db

        var exist :Boolean = false
        viewModelScope.launch {
            exist = doesDayExist()
        }

        //if day doesnt exist in db, create it
        if (!exist)
        {
            onNewDay()
        }

    }

    //function to check if given date is in db
    private suspend fun doesDayExist(): Boolean{
        return dayDatabaseDao.doesDayExist(dts.toSimpleString(currDate.time))
    }

我的插入和更新工作完美无缺,我已检查数据是否按预期在数据库中。即使我正在调用查询,exist 的值也不会改变,当我将它设置为 true 时它保持为 true,当最初设置为 false 时它保持为 false。我错过了什么?

您正在设置存在于协程函数中。 你必须携带代码到coroutinescope。

    viewModelScope.launch{
        exist = doesDayExist()
        if (!exist)
          {
            onNewDay()
          }
    }

启动协程会将其排队,但当前函数会在该协程在后台启动时继续执行。你的函数 returns 在协程完成它的工作之前。在协程中得到结果后,你需要把你想要的代码 运行。

See here for more information about asynchronous work.协程内部的代码是同步的,但是启动协程是异步的。