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



我有以下数据表

@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

在viewModel类中,我有:

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。我错过了什么?

您正在设置是否存在于关联函数中。你必须携带代码到协同工作。

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

启动一个协同程序会将其排队,但当该协同程序在后台启动时,当前函数会继续。函数在协程完成工作之前返回。您需要将得到结果后想要运行的代码放入协同程序中。

有关异步工作的更多信息,请参阅此处。协同程序内部的代码是同步的,但启动协同程序是异步的。

最新更新