【问题标题】:How should I connect Room, LiveData and ContentProvider?我应该如何连接 Room、LiveData 和 ContentProvider?
【发布时间】:2020-11-24 04:14:49
【问题描述】:

问题

为了了解如何在我的示例应用程序中使用 ContentProvider,我正在实施 ContentProvider。场景如下(我的项目有两个模块):我有一个允许写入和读取数据库的 ma​​in 模块 和一个只允许读取数据库的 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。


问题

  1. 我应该为我的ContentProvider 定义一个返回Cursor 对象的新DAO还是应该使用MyRoomDatabase.openHelper.readableDatabase.query(...) 进行查询?
  2. 从我的ContentProvider 类中获取 Cursor 对象后,我是否必须手动将 Cursor 对象映射到我的数据类(供消费者应用程序使用),或者 Room 是否为此提供了方便的方法?
  3. 返回的 Cursor 对象不是 LiveData。在我的主应用程序中,当数据更新发生时,RecyclerView 会自动收到通知,因为它正在观察 LiveData。如何对 Cursor 对象执行相同操作,或者是否有另一个我应该知道的可以监视光标更改的类?

【问题讨论】:

    标签: android android-room android-contentprovider android-livedata android-cursor


    【解决方案1】:

    你可以通过这个获取实时数据

        class FavoriteUserProvider : ContentProvider() {
        private lateinit var roomDao: FavoriteUserDao
    
        override fun onCreate(): Boolean {
            context?.let {
                val context = it
                roomDao = FavoriteUserRoomDatabase.getDatabase(context).roomDao()//ur abstract Dao
            }
            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 -> {
                    ... // u can get livedata here by 
                     roomDao.getFavoriteUsers().obseve(lifecycleOwner,Observer{users ->
                        // you can use matrixCursor to build cursor here
                         
                    })
                }
            }
        }
        ...
    }
    

    【讨论】:

    • 如何使用matrixCursor来构建游标?此外,我不会仍然返回一个 Cursor,因此我的消费者应用程序并没有真正监听 Cursor 的变化吗?
    猜你喜欢
    • 2019-06-06
    • 1970-01-01
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    • 2021-07-27
    相关资源
    最近更新 更多