如何使用 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.协程内部的代码是同步的,但是启动协程是异步的。
我有以下数据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.协程内部的代码是同步的,但是启动协程是异步的。