Je dois charger la version mise en cache des données de la base de données et simultanément je veux faire une requête au serveur pour de nouvelles données et je veux le faire par page. Donc, par exemple pour la première page je veux montrer une version mise en cache des données de première page de la base de données tout en demandant des données fraîches seulement pour la première page.
Je veux atteindre cet objectif en utilisant Paging Library. J'ai essayé de créer une source de données personnalisée qui m'a aidé à intercepter la demande de chargement de page. Ensuite, je faisais un appel réseau avec le numéro de page et la limite requis et je retournais une version mise en cache de DB. Je mets à jour la base de données mais ces mises à jour ne sont pas reflétées. (Je crois que tout le tableau est observé pour toutes les modifications utilisant Invalidation Tracker et la source de données est invalidée chaque fois que les tables sont invalidées, j'ai ajouté ce tracker dans ma source de données mais il ne fonctionne toujours pas, j'ai pu faire que invalidation Tracker chose en créant temporairement: LivePagedListProvider getJobs() dans Jobdao et vérifier la mise en œuvre générée)Bibliothèque de pagination - remplir à partir du cache lors de la demande du réseau
code:
public class JobListDataSource<T> extends TiledDataSource<T> {
private final JobsRepository mJobsRepository;
private final InvalidationTracker.Observer mObserver;
String query = "";
public JobListDataSource(JobsRepository jobsRepository) {
mJobsRepository = jobsRepository;
mObserver = new InvalidationTracker.Observer(JobEntity.TABLE_NAME) {
@Override
public void onInvalidated(@NonNull Set<String> tables) {
invalidate();
}
};
jobsRepository.addInvalidationTracker(mObserver);
}
@Override
public int countItems() {
return DataSource.COUNT_UNDEFINED;
}
@Override
public List<T> loadRange(int startPosition, int count) {
return (List<T>) mJobsRepository.getJobs(query, startPosition, count);
}
public void setQuery(String query) {
this.query = query;
}
}
fonctions du référentiel Emploi:
public List<JobEntity> getJobs(String query, int startPosition, int count) {
if (!isJobListInit) {
JobList jobList = mApiService.getOpenJobList(
mRequestJobList.setPageNo(startPosition/count + 1)
.setMaxResults(count)
.setSearchKeyword(query)
).blockingSingle();
mJobDao.insert(jobList.getJobsData());
}
return mJobDao.getJobs(startPosition, count);
}
public void addInvalidationTracker(InvalidationTracker.Observer observer) {
mAppDatabase.getInvalidationTracker().addObserver(observer);
}