首页 > 解决方案 > 如何从 Room 数据库中获取数据

问题描述

我编写了一个函数来监听我的房间数据库中发生的变化。如果我只想在任何其他时间获取数据而不听取更改,我应该做什么。

@Dao
interface OfflineDataDao {
    @Query("SELECT * FROM OfflineData")
    fun getOfflineData(): Flow<List<OfflineData>>

class OfflineDatabaseManager private constructor(
    private val dp: LibraryDatabase
) {

//LISTENS TO CHANGES IN THE DATABASE
    fun getOfflineData(): Flow<List<OfflineData>> {
        return dp.getOfflineDataDao().getOfflineData()
    }

}

fun getOfflineData() {
    launch {
        OfflineDatabaseManager.getInstance(app.applicationContext).getOfflineData().collect {
            Timber.d("OfflineDataLib - observing offline data" + it.toString())
     
        }
    }
}

使用上述函数,我可以监听数据库中的变化,但是如果我只想从数据库中获取数据,那该怎么办。

请问我该怎么做

更准确地说,我有一个监听网络变化的功能,如果有网络或没有网络,我想在其中获取离线数据中的数据,我该怎么做。

这是我监听网络变化的功能

   fun listenToConnectionChanges() {
        launch {
            OfflineDatabaseManager.getInstance(app.applicationContext).networkConnectionActivated
                .collect { isNetworkConnectionActive ->
                    Timber.d("OfflineDataLib - getOfflineData() - isNetworkConnectionActive - " + isNetworkConnectionActive)
                    if (isNetworkConnectionActive) {
                        //I WANT TO GET THE DATA FROM THE DATABASE
                    }
                }
        }
    }

谢谢R

标签: androidkotlinandroid-roomkotlin-coroutines

解决方案


您可以使用挂起函数并直接List<OfflineData>在您的 DAO 中返回。

离线数据道:

@Query("SELECT * FROM OfflineData")
suspend fun getOfflineData(): <List<OfflineData>

离线数据库管理器:

suspend fun getOfflineData(): <List<OfflineData> {
    return dp.getOfflineDataDao().getOfflineData()
}

然后直接获取协程范围内的数据:

fun getOfflineData() {
    launch {
        val items = OfflineDatabaseManager.getInstance(app.applicationContext).getOfflineData()
    }
}

推荐阅读