Шаблон репозитория с SqlBrite / SqlDelight (автономная база данных) и дооснащение (запрос Http)

Я использую шаблон репозитория в 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 на нем с delaySubscription 200ms .

Я попытался использовать Observable.concat но поток SqlBrite никогда не вызывает onComplete поэтому наблюдаемый server никогда не запускается.

Я также попробовал Observable.combineLatest который не работал, потому что он продолжает ждать, пока server наблюдаться, чтобы вернуть данные, прежде чем исправить что-либо, и Observable.switchOnNext тоже не работает.

Я ищу репозиторий, который:

  • Сохраняет подписку на SqlBrite (DB) в случае обновлений БД
  • Всегда извлекает данные с сервера и записывает их в базу данных
  • Не следует испускать пустой результат, если в базе данных ничего не было, и сетевой запрос все еще продолжается. Это, потому что пользователь должен увидеть индикатор выполнения в случае первой загрузки.

Вы кодируете прямо противоречит тому, что вы хотите сделать. Эта строка:

  Observable<List<Item>> db = getItemsFromDbById(id) .filter(items -> items != null && items.size() > 0); 

Является противоречием с самим собой, потому что вы возвращаете отдельные элементы запроса базы данных и называете его db – как если бы база данных (или ее ссылка) сама. С этого момента ясно, что предоставленный вами код не может быть помог.

В шаблоне репозитория доступно много шаблонов java. Например: https://www.bignerdranch.com/blog/the-rxjava-repository-pattern/

Если это не помогло, попробуйте предоставить код, который, по крайней мере, отдаленно описывает то, что вы описываете.