我有一个Room数据库的简单Dao界面,在其中我具有挂起函数以从表中插入和获取数据。
在我的DBHelper
类中,我尝试使用launch - CoroutineScope
插入数据,但似乎不在启动内,并且启动内的功能未执行。
关于我可能做错了什么的任何建议,请
OfflineDataDao
@Dao
interface OfflineDataDao {
@Query("SELECT * FROM offlineDatax")
suspend fun getOfflineData(): List<OfflineDatax>
@Insert
suspend fun insertOfflineData(offlineData: OfflineDatax): Long
}
实体
@Entity
data class OfflineDatax (
@PrimaryKey val uid: Int,
@ColumnInfo(name = "requestJSON") val requestJSON: String?,
@ColumnInfo(name = "requestCode") val requestCode: String?
)
数据库助手
我访问dao暂停方法的类
class DBHelper @Inject constructor(
private val userDao: UserDao,
private val offlineDataDao: OfflineDataDao
) : CoroutineScope {
private var job: Job = Job()
override val coroutineContext: CoroutineContext
get() = Dispatchers.Main + job
fun accessDBFunction() {
var offlineDatax = OfflineDatax(1, "rjson", "rCode")
addOfflineData(offlineDatax)
getOfflineData()
}
fun addOfflineData(offlineDatax: OfflineDatax): Long {
var lng: Long = 0L
launch {
lng = offlineDataDao.insertOfflineData(offlineDatax) // IS NOT CALLED, DOES NOT GET INTO LAUNCH
}
return lng
}
fun getOfflineData (): List<OfflineDatax> {
var offlineData = emptyList<OfflineDatax>()
launch {
offlineData = offlineDataDao.getOfflineData(); // IS NOT CALLED, DOES NOT GET INTO LAUNCH
}
Timber.d("offlinedata " + offlineData.toString())
return offlineData
}
}
最佳答案
只需通过suspend
修饰符使函数挂起并直接从它们返回,它们就会将自身挂起到Room库中定义的自己的调度程序中。
suspend fun addOfflineData(offlineDatax: OfflineDatax): Long =
offlineDataDao.insertOfflineData(offlineDatax)
suspend fun getOfflineData (): List<OfflineDatax> =
offlineDataDao.getOfflineData().also { Timber.d("offlinedata " + it.toString()) }
并从任何协程调用该函数。
关于android - 无法从CoroutineScope启动访问暂停Dao功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62128500/