заметил, что данный способ не совсем верный: если впервые получить данные с сервера, потом перезайти в приложение, возвратятся данные из локальной базы. А в это время данные на сервере могут обновиться, получается, всегда несвежие данные будут видны
public Maybe<List<Review>> getReviewsByProductId(int id) {
Observable<List<Review>> remote = remoteDataSource.getReviewsByProductId(id)
.doOnNext(reviews -> localDataSource.insertReviews(reviews))
.doOnNext(reviews -> cacheDataSource.putReviews(id, reviews));
Observable<List<Review>> local = localDataSource.getReviewsByProductId(id)
.filter(reviews -> !reviews.isEmpty())
.doOnNext(reviews -> cacheDataSource.putReviews(id, reviews));
Observable<List<Review>> cache = cacheDataSource.getReviewsByProductId(id);
return Observable.concat(cache, local, remote)
.firstElement()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
Как правильно реализовать такое?
1) получить данные из сети;
2) при следующих обращениях брать из кеша
3) если сети нет, из базы