我正在使用Architecture Components and Room,但我不认为它来自那里 我使用协程从数据库中插入和检索数据。一切正常,直到我来到this problem
最后一个问题已解决,但他引起了另一个问题。我以前插入数据的协程之一运行良好,现在withContext(Dispatchers.IO) {
中的代码从未读取过。其他所有功能都在起作用,而这个功能过早了。 该应用不会崩溃,没有错误日志,但由于从未读取withContext而未插入数据
我尝试过重建项目,重新启动Android Studio,重新安装应用程序,但是没有任何效果,我将错误缩小到了几行,但是我在网上找不到关于该错误的任何信息,我'尝试过重命名它,并通过另一个函数传递它,但是什么也没做,这是黑魔法,我不知道为什么它突然停止工作,在过去的一周我什至没有修改代码。
fun insertNewStats(sessionID: Long, fishSpeciesID: Int) {
uiScope.launch {
//This access to database is working fine
val stats = checkDatabaseForStats(sessionID, fishSpeciesID)
if (stats == null) {
//This is the call of the function that is not working
insertStatsToDatabase(sessionID, fishSpeciesID)
} else {
stats.numberOfCatch++
updateStatsToDatabase(stats)
}
}
}
这是checkDatabaseForStats,如果我将插入物放在此处,它将可以完美工作,这意味着它不是来自DAO函数,而是来自withContext
private suspend fun checkDatabaseForStats(sessionID: Long, fishSpeciesID: Int) : SessionsFishStats?{
return withContext(Dispatchers.IO) {
val stats = database.getStat(sessionID, fishSpeciesID)
stats
}
}
无效的部分,已达到功能,而不是 withContext
private suspend fun insertStatsToDatabase(sessionID: Long, fishSpeciesID: Int) {
//This function is reached, the code put there will be read and work
withContext(Dispatchers.IO) {
//And from there nothing, this code is never reached
database.insertStats(
SessionsFishStats(fk_sessionId = sessionID, fishSpeciesId = fishSpeciesID, numberOfCatch = 1L)
)
}
}
这是我的DAO中的查询
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertStats(stats: SessionsFishStats)
如果我将withContext
直接放在insertNewStats
中(不通过函数传递),也将不起作用
我想提醒一下,这段代码曾经很好地运行,并且在发生不相关的错误时停止了工作。该应用程序不会崩溃,只是代码未读。 我的应用程序中的所有其他Insert查询都可以正常工作,其他所有withContext和DAO函数也都可以正常工作,只是因为黑魔法而已被诅咒的那个
我已经做到了,这就是将所有内容都放在同一个函数中,并且效果很好。很奇怪,我也不知道为什么...
fun whyIsThisWorking(sessionID: Long, fishSpeciesID: Int) {
uiScope.launch {
withContext(Dispatchers.IO) {
val stat = database.getStat(sessionID, fishSpeciesID)
if (stat == null) {
database.insertStat(
SessionsFishStats(fk_sessionId = sessionID, fishSpeciesId = fishSpeciesID, numberOfCatch = 1L)
)
} else {
stat.numberOfCatch++
database.updateStats(stat)
}
}
}
}