代码之家  ›  专栏  ›  技术社区  ›  amin mahmoudi

如何在存储库中合并过滤领域结果和网络搜索

  •  0
  • amin mahmoudi  · 技术社区  · 7 年前

    我想要合并领域结果和网络搜索,并在用户界面上观察这个结果。

    下面的代码在离线使用中很好地工作,但是当从网络更新数据时 ,领域自动刷新不考虑上一个搜索查询只查找所有结果。

    怎样才能更好地解决这一难题?

    RXX搜索视图

     @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() {
                    }
                })
        ;
    }
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   amin mahmoudi    6 年前

    我使用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());
    
    }
    }