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