Как мне подключить Room, LiveData и ContentProvider? - PullRequest
0 голосов
/ 04 августа 2020

Проблема

Я использую ContentProvider, чтобы знать, как использовать ContentProvider в моем примере приложения. Сценарий выглядит следующим образом (два модуля для моего проекта): у меня есть основной модуль , который позволяет писать и читать в базе данных, и потребительский модуль , который позволяет только чтение базы данных. База данных будет доступна для потребительского модуля с помощью ContentProvider.

В моем основном приложении я использую Repository , чтобы предоставить методы в 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. Должен ли я определять новый DAO, который возвращает объект Cursor только для моего ContentProvider или , следует ли мне запрашивать, используя MyRoomDatabase.openHelper.readableDatabase.query(...)?
  2. После получения объекта Cursor из моего ContentProvider класса, нужно ли мне вручную сопоставить объект Cursor с моим классом данных (для потребления потребительским приложением), или Room предоставляет для этого удобный метод?
  3. Возвращенный объект Cursor не является LiveData. В моем основном приложении, когда происходит обновление данных, RecyclerView автоматически уведомляется, потому что он наблюдает за LiveData. Как я могу сделать то же самое с объектом Cursor, или есть другой класс, о котором я должен знать, который может отслеживать изменения курсора?

1 Ответ

0 голосов
/ 04 августа 2020

вы можете получить там живые данные с помощью этого

    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
                     
                })
            }
        }
    }
    ...
}
...