【发布时间】:2020-11-24 04:14:49
【问题描述】:
问题
为了了解如何在我的示例应用程序中使用 ContentProvider,我正在实施 ContentProvider。场景如下(我的项目有两个模块):我有一个允许写入和读取数据库的 main 模块 和一个只允许读取数据库的 consumer 模块数据库。数据库将使用 ContentProvider 暴露给 consumer 模块。
在我的主应用程序中,我使用 Repository 来公开 Room 的 DAO 中的方法以检索 LiveData 对象。一个这样的 DAO 的示例。
interface FavoriteUserDao {
@Query("SELECT * FROM ${FavoriteUserColumns.TABLE_NAME}")
fun getFavoriteUsers(): LiveData<List<FavoriteUser>>
...
}
我将使用LiveData 来更新我的主应用程序的RecyclerView。当我想使用该 DAO 从 ContentProvider 类中查询我的消费者应用程序时出现问题(我计划在 query 方法中使用它)。 query 只接受 Cursor? 的返回值。这是我的ContentProvider 课程。
class FavoriteUserProvider : ContentProvider() {
private lateinit var roomDatabase: FavoriteUserRoomDatabase
override fun onCreate(): Boolean {
context?.let {
val context = it
roomDatabase = FavoriteUserRoomDatabase.getDatabase(context)
}
return true
}
override fun query(
uri: Uri, projection: Array<String>?, selection: String?,
selectionArgs: Array<String>?, sortOrder: String?
): Cursor? {
val context = context ?: return null
when (uriMatcher.match(uri)) {
FAVORITE_USER_LIST -> {
... // How should I get the LiveData object here?
}
}
}
...
}
可以看出,我不能在那里简单地使用 DAO。
问题
- 我应该为我的
ContentProvider定义一个返回Cursor 对象的新DAO还是应该使用MyRoomDatabase.openHelper.readableDatabase.query(...)进行查询? - 从我的
ContentProvider类中获取 Cursor 对象后,我是否必须手动将 Cursor 对象映射到我的数据类(供消费者应用程序使用),或者 Room 是否为此提供了方便的方法? - 返回的 Cursor 对象不是 LiveData。在我的主应用程序中,当数据更新发生时,
RecyclerView会自动收到通知,因为它正在观察 LiveData。如何对 Cursor 对象执行相同操作,或者是否有另一个我应该知道的可以监视光标更改的类?
【问题讨论】:
标签: android android-room android-contentprovider android-livedata android-cursor