我正在使用 SqlBrite/SqlDelight 在 RxJava 中实现存储库模式,用于离线数据存储和 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 返回数据并且Observable.switchOnNext
也不起作用。
我正在寻找的是一个存储库,它:
- 保持对 SqlBrite (DB) 的订阅处于打开状态,以防数据库更新
- 始终从服务器获取数据并将其写入数据库
- 如果数据库中没有任何内容并且网络请求仍在进行中,则不应发出空结果。这是因为用户应该在第一次加载的情况下看到一个进度条。