square/sqlbrite

[RxJava2] Is SqlBrite have a way to stop trigger Subscription(Disposable) for a single modify sql execution?

KpStP opened this issue · 3 comments

KpStP commented

Updated Question.

I am using BriteContentResolver to create query, that query associate with a Disposable. This Disposable keep listen any changes of specify table. I want execute a modify sql without trigger QueryObservable. Is SqlBrite have a way to do this?

private CompositeDisposable disposables = new CompositeDisposable();
private Disposable disposable;


private void initialize(){
    QueryObservable queryObservable = mContentResolverHelper.createQuery(TableA.buildTableUri(), TableAColumns, null, null, null, false);
    disposable = RxJavaInterop.toV2Observable(queryObservable
                    .mapToList(mTableAMapperFunction)
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new Subscriber<List<Item>>() {
                        @Override
                        public void onNext(List<Item> items) {
                            // do something
                        }

                        @Override
                        public void onError(Throwable t) {
                        }

                        @Override
                        public void onComplete() {
                        }
                    });
    disposables.add(disposable);
}


private void updateTitleWithoutTriggerDisposable(String id, String value){
    ContentValues values = new ContentValues();
    values.put("title", value);
    // expect the update not trigger the disposable.
    mContentResolver.update(TableA.buildTableUri(), values, "id=?", {id});
}
KpStP commented

Sorry, my question was unclear. I want the disposable keep subscribe any changes of TableA, except the update from updateTitleWithoutTriggerDisposable().

Updated code:

    private CompositeDisposable disposables = new CompositeDisposable();
    private Disposable disposable;


	private void initialize(){
        QueryObservable queryObservable = mContentResolverHelper.createQuery(TableA.buildTableUri(), TableAColumns, null, null, null, false);
        disposable = RxJavaInterop.toV2Observable(queryObservable
                        .mapToList(mTableAMapperFunction)
                        .subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .subscribe(new Subscriber<List<Item>>() {
                            @Override
                            public void onNext(List<Item> items) {
                                // do something
                            }

                            @Override
                            public void onError(Throwable t) {
                            }

                            @Override
                            public void onComplete() {
                            }
                        });
        disposables.add(disposable);
    }
    

    private void updateTitleWithoutTriggerDisposable(String id, String value){
        ContentValues values = new ContentValues();
        values.put("title", value);
        // expect the update not trigger the disposable.
        mContentResolver.update(TableA.buildTableUri(), values, "id=?", {id});
    }

RxJava has switchmap operator that unsubscribes from previous inner
Observable when upstream emits:

updateSql.switchMap { sqlBrite.query()}

We have no way of ignoring updates. SQL Brite just wraps the normal content resolver notifications. So if Android sends the trigger then SQL Brite reacts to the trigger.