Моя цель - реализовать разбиение на страницы, когда каждая страница сначала отображается из базы данных, и одновременно из сети запрашивается одна и та же страница.
Я хочу решить эту проблему с использованием библиотеки подкачки.
Пока я вижу это следующим образом:
- База данных комнат возвращает «живые» данные пользователей, например:
@Query("SELECT * FROM user " +
"WHERE id > :lastUserId " +
"ORDER BY id ASC " +
"LIMIT :pageSize")
fun getUsersPage(lastUserId: Long, pageSize: Int) Flowable<List<DBUser>>
где lastUserId используется для определения начала страницы.
- Затем в репозитории я могу запросить каждую страницу из базы данных и сети и использовать объединенный результат:
fun getUsersPage(lastUserId: Long): Flowable<List<User>> {
val localData = database.userDao().getUsersPage(lastUserId, USERS_PAGE_SIZE)
.subscribeOn(AppSchedulers.computation())
.map { DbUserMapper.mapTo(it) }
val remoteData = retrofitService.getUsers(lastUserId, USERS_PAGE_SIZE)
.subscribeOn(AppSchedulers.io())
.observeOn(AppSchedulers.computation())
.map { NetUserMapper.mapTo(it) }
.doOnNext {
// cache users to db
database.userDao().insertUsers(DbUserMapper.mapFrom(it))
}
return Flowable.mergeDelayError(localData, remoteData)
}
или я могу просто подписаться на изменения базы данных. Результаты из сети будут храниться в базе данных, что приведет к обновлению.
Я боролся за реализацию этой задачи с использованием Jetpage Paging Library.
Как указано в документации по подкачке ,
это один из возможных сценариев.
Однако в упомянутом примере понятно, как загрузить данные только после того, как мы достигли конца таблицы базы данных. Это можно сделать с помощью PagedList.BoundaryCallback, который
Сигналы, когда PagedList достиг конца доступных данных.
Но я понятия не имею, как извлечь каждую страницу из сети, поскольку изначально загруженные данные могли измениться.
Одной из идей является вызов упомянутого getUsersPage()
из источника данных (скажем, PageKeyedDataSource
), точно в loadInitial()
и loadAfter()
методах.
Но я не уверен, что он обновит данные, как только getUsersPage()
испустит следующие данные, потому что javadoc говорит:
Обратный вызов может быть вызван только один раз, и будет вызван при повторном вызове.
Кроме того, есть много примеров использования библиотеки подкачки,
но все, что я нашел, используют либо только данные из сети, либо только из базы данных.
Любой совет приветствуется