Я реализую шаблон репозитория в RxJava, используя SqlBrite/SqlDelight для автономного хранения данных и модификации для запросов Http
Вот пример этого:
protected Observable<List<Item>> getItemsFromDb() {
return database.createQuery(tableName(), selectAllStatement())
.mapToList(cursor -> selectAllMapper().map(cursor));
}
public Observable<List<Item>>getItems(){
Observable<List<Item>> server = getRequest()
.doOnNext(items -> {
BriteDatabase.Transaction transaction = database.newTransaction();
for (Item item : items){
database.insert(tableName(), contentValues(item));
}
transaction.markSuccessful();
transaction.end();
})
.flatMap(items -> getItemsFromDbById())
.delaySubscription(200, TimeUnit.MILLISECONDS);
Observable<List<Item>> db = getItemsFromDbById(id)
.filter(items -> items != null && items.size() > 0);
return Observable.amb(db, server).doOnSubscribe(() -> server.subscribe(items -> {}, throwable -> {}));
}
Текущая реализация использует Observable.amb
для получения последнего из 2 потоков и возвращает поток db
в случае, если db
имеет данные или сервер в противном случае. Чтобы предотвратить ранний сбой в случае отсутствия Интернета, server
имеет delaySubscription
на нем с 200ms
.
Я попытался использовать Observable.concat
, но поток SqlBrite никогда не вызывает onComplete
, поэтому server
наблюдаемый никогда не запускается.
Я также пробовал Observable.combineLatest
, который не работал, потому что он продолжает ждать, пока server
наблюдается, чтобы возвращать данные, прежде чем что-либо исправить, и Observable.switchOnNext
тоже не работает.
Я ищу репозиторий, который:
- Открывает подписку на SqlBrite (DB) в случае обновлений БД
- Всегда извлекает данные с сервера и записывает их в базу данных
- Не следует выводить пустой результат в случае, если в базе данных ничего не было, и сетевой запрос все еще продолжается. Это, потому что пользователь должен увидеть индикатор выполнения в случае первой загрузки.