android - 无法从CoroutineScope启动访问暂停Dao功能

标签 android kotlin android-room kotlin-coroutines

我有一个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/

相关文章:

android - ListView的state_activated、state_selected、state_pressed、state_focused的解释

java - 转换android中的时间格式

java - 亚行——它是如何运作的?

kotlin - Corda Custom Notary教程问题

android - 为什么 DAO 在 RoomDatabase 中被定义为有趣?

java - 如何将启动器主屏幕添加到我的应用程序?

android - Kotlin Flow - 有没有类似于 LiveData 的 emitSource 的东西?

android - 房间: using variable in query

android - 以编程方式导入 Room 数据库

Android 房间 rawquery 问题