美文网首页
安卓-ObjectBox数据库笔记3:数据观察者和Rx

安卓-ObjectBox数据库笔记3:数据观察者和Rx

作者: 缘焕 | 来源:发表于2021-09-01 21:19 被阅读0次

    (安卓)ObjectBox数据库笔记-数据观察者和Rx

    [TOC]

    1.订阅一个数据表的变化 DataSubscription DataObserver

    让我们从一个示例开始,演示如何使用响应式数据观察者:

    // Keep a reference until the subscription is cancelled
    // to avoid garbage collection.
    private DataSubscription subscription;
    
    // ...
    // Build a regular query.
    Query<Task> query = taskBox.query().equal(Task_.complete, false).build();
    // Subscribe to its results.
    subscription = query.subscribe()
        .on(AndroidScheduler.mainThread())
        .observer(data -> updateResultDisplay(data));
    
    // Cancel to no longer receive updates (e.g. leaving screen).
    subscription.cancel();
    private void updateResultDisplay(List<Task> tasks) {
    
       // Do something with the given tasks.
    
    }
    

    1.查询是在后台执行的

    2.一旦查询完成,观察者就会获得结果数据

    3.once updated query results are in, they are propagated to the observer

    4..on(AndroidScheduler.mainThread()) 观察者在Android的主线程被调用

    数据订阅,在UI更新或其他地方非常有用。

    在安卓中,订阅和取消订阅,要在相应的生命周期内相应执行

    可执行订阅的生命周期:onCreate()/onStart()/onResume()

    可取消订阅的生命周期:onDestroy()/onStop()/onPause().

    2.取消多个订阅 DataSubscriptionList

    一个Query有一个DataSubscription,一次只能取消一个订阅。一个DataSubscriptionList可以用于多个Query,同时取消多个订阅。

    subscriptionList = new DataSubscriptionList();
    ObjectBox.get().boxFor(UserEntity.class).query().build().subscribe(subscriptionList).observer(new DataObserver<List<UserEntity>>() {
        @Override
        public void onData(List<UserEntity> data) {
            Log.d(TAG,"subscriptionList 观察到UserEntity表数据变化 size:"+data.size());
        }
    });
    ObjectBox.get().boxFor(Person.class).query().build().subscribe(subscriptionList).observer(new DataObserver<List<Person>>() {
        @Override
        public void onData(List<Person> data) {
            Log.d(TAG,"subscriptionList 观察到Person表数据变化 size:"+data.size());
        }
    });
    
    ...
    if(subscriptionList!=null && !subscriptionList.isCanceled()) {
        subscriptionList.cancel();
    }
    ...
    

    3.观察者和事务 Observers and Transactions

    观察者通知发生在事务提交之后。对于某些场景,了解事务边界特别重要。如果分别调用box.put()或remove(),将启动并提交一个隐式事务。例如,这段代码将在User.class上触发两次数据观察者:

    box.put(friendUser);
    box.put(myUser);
    

    有几种方法可以将多个操作组合到一个事务中,例如使用BoxStore类中的runInTx()或callInTx()方法之一。对于我们的简单示例,只需使用接受多个对象的put()重载:

    box.put(friendUser, myUser);
    

    4.数据转换 Transforming data

    subscription = boxStore.subscribe()
        .transform(clazz -> return boxStore.boxFor(clazz).count())
        .observer(count -> updateCount(count));
    

    把查询的结果,转换成另一种对象,例如新的可观察对象?

    1.实际上“转换”任何数据都不需要转换。从技术上讲,返回接收到的相同数据并使用(或不使用)它进行一些处理是没问题的。

    Transforms are not required to actually “transform” any data. Technically, it is fine to return the same data that is received and just do some processing with (or without) it.

    2.Transforms 总是异步执行的。执行持久的操作是很好的。

    Transformers are always executed asynchronously. It is fine to perform long lasting operations.

    5.ErrorObserver

    和transform配合使用,当transform里发生异常时,异常会回调到onError方法里。

    public interface ErrorObserver {
        void onError(Throwable th);
    }
    

    6.Single Notifications vs. Only-Changes

    当您订阅一个查询时,DataObserver在默认情况下会获得以下两个行为

    1.初始查询结果(在订阅之后)

    2.当数据表有增删改查时,更新查询结果(底层数据已更改)

    如果只想查一次,以后的增删改查不继续监听。或者订阅时不需要初始化的结果,只需要监听后面的增删改查怎么处理?

    single():只回调初始化查询结果

    onlyChanges(): 只订阅以后的增删改查,不需要初始化查询结果

    ObjectBox.get().boxFor(UserEntity.class)
            .query()
            .build()
            .subscribe(subscriptionList)
            .on(AndroidScheduler.mainThread())
            .single()
            .observer(new DataObserver<List<UserEntity>>() {
                @Override
                public void onData(List<UserEntity> data) {
                    Log.d(TAG, "初始化查询结果single:" + data);
                }
            });
    
    ObjectBox.get().boxFor(UserEntity.class)
            .query()
            .build()
            .subscribe(subscriptionList)
            .on(AndroidScheduler.mainThread())
            .onlyChanges()
            .observer(new DataObserver<List<UserEntity>>() {
                @Override
                public void onData(List<UserEntity> data) {
                    Log.d(TAG, " 观察到数据变化onlyChanges:" + data);
                }
            });
    

    7.弱引用 Weak References

    Sometimes it may be nice to have a weak reference to a data observer. Note that for the sake of a deterministic flow, it is advisable to cancel subscriptions explicitly whenever possible. If that does not scare you off, use weak() after subscribe().

    ObjectBox.get().boxFor(UserEntity.class)
            .query()
            .build()
            .subscribe(subscriptionList)
            .on(AndroidScheduler.mainThread())
            .weak()
            .onlyChanges()
            .observer(new DataObserver<List<UserEntity>>() {
                @Override
                public void onData(List<UserEntity> data) {
                    Log.d(TAG, " 观察到User表数据变化onlyChanges:" + data);
                }
            });
    

    8.ObjectBox RxJava扩展库 ObjectBox RxJava Extension Library

    它提供了类RxQuery和RxBoxStore。两者都提供了使用RxJava方式进行订阅的静态方法。

    对于一般的对象更改,你可以使用RxBoxStore来创建一个可观察对象。

    RxBoxStore.observable(ObjectBox.get()).subscribe(new Consumer<Class>() {
        @Override
        public void accept(Class aClass) throws Exception {
            Log.d(TAG, "RxBoxStore.observable(ObjectBox.get()).subscribe");
        }
    });
    

    RxQuery允许使用以下方法订阅查询对象:

    1.Flowable

    2.Observable

    3.Single

    private Disposable disposable;
    // ...
    Query query = box.query().build();
    disposable = RxQuery.observable(query).subscribe(this);
    

    相关文章

      网友评论

          本文标题:安卓-ObjectBox数据库笔记3:数据观察者和Rx

          本文链接:https://www.haomeiwen.com/subject/lmefwltx.html