【问题标题】:how can i merge filter realm result and network search in repository如何在存储库中合并过滤器领域结果和网络搜索
【发布时间】:2018-07-24 05:49:21
【问题描述】:

我想要合并领域结果和网络搜索并在 UI 上观察这个结果。

下面的代码在离线使用时效果很好,但是当从网络更新数据时 ,Realm Auto Refresh 不考虑上次搜索查询,只查找所有结果。

有什么更好的模式来实现这个目的?

rx_search 查看

 @Override
public void search(Observable<CharSequence> searchObservable) {
    isSearching = true;
    Disposable subscribe = searchObservable
            .map(CharSequence::toString)
            .filter(searchViewQueryTextEvent ->
                    searchViewQueryTextEvent.length() > 1).distinctUntilChanged()
            .flatMap(s -> {
                    String[] s1=s.trim().split(" ");
                    String s2="";
                    for (String e:s1){
                        s2=s2+e+"*";
                    }

               return Observable.just(s2);
                })
              //switchMap to get result from repository
            .switchMap(s -> mInteractor.searchStores(s).onBackpressureLatest().toObservable())
            .subscribeOn(AndroidSchedulers.mainThread())
            .subscribe(stores -> {
                        if (mView != null) {
                            mView.setList(stores);
                        }
                    }, Throwable::printStackTrace
                    , () -> {
                    }, d -> disposable.add(d));
    disposable.add(subscribe);

从领域获取结果并从网络更新数据库:

@Override
public Flowable<RealmResults<Stores>> searchStores(String searchString) {
    searchNetwork(searchString); //  after update from net realm emit all result table
    try (Realm realm = Realm.getDefaultInstance()) {
         //Query work for first time and after update data  flowble 
         //emit all item and Does not consider  query
        RealmQuery<Stores> query = realm.where(Stores.class).like("name", searchString, Case.INSENSITIVE);
        return query
                .findAll()
                .asFlowable();

    }
}
  private void searchNetwork(CharSequence searchString) {
    api.searchList(searchString)
            .doOnError(Throwable::printStackTrace)
            .subscribeOn(Schedulers.io())
            .observeOn(Schedulers.io())
            .filter(statusPojo::getStatus)
            .switchMap(data -> Observable.just(data.getData()))
            .subscribe(new DisposableObserver<List<Stores>>(){

                @Override
                public void onNext(List<Stores> stores) {
                    try (Realm realm = Realm.getDefaultInstance()) {
                        realm.executeTransaction(r -> r.insertOrUpdate(stores);
                    }
                }

                @Override
                public void onError(Throwable e) {
                    e.printStackTrace();
                }

                @Override
                public void onComplete() {
                }
            })
    ;
}

【问题讨论】:

    标签: java android realm rx-java2


    【解决方案1】:

    每次领域 flowble 发出更改的结果及其工作时,我都使用 switchMap 设置查询:

    @Override
    public Flowable<RealmResults<Stores>> searchStores(String searchString) {
    searchNetwork(searchString);
    
     try (Realm realm = Realm.getDefaultInstance()) {
    
        RealmQuery<Stores> query = realm.where(Stores.class).like("name", searchString, 
        Case.INSENSITIVE);
        return query
                .findAll()
                .asFlowable()
                .onBackpressureLatest()
                .flatMap(realmResultsCollectionChange -> 
                          query.findAll().asFlowable());
    
    }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      • 2020-04-07
      • 2016-11-02
      • 2020-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多