有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

安卓领域。io[Java]通知如何仅侦听特定表中的更改?

我在realm java文档中看到了这个示例代码

public class MyActivity extends Activity {
    private Realm realm;
    // A reference to RealmChangeListener needs to be held to avoid being
    // removed by the garbage collector.
    private RealmChangeListener realmListener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      realm = Realm.getDefaultInstance();
      reamlListener = new RealmChangeListener() {
        @Override
        public void onChange() {
            // ... do something with the updates (UI, etc.) ...
        }};
      realm.addChangeListener(realmListener);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // Remove the listener.
        realm.removeChangeListener(realmListener);
        // Close the realm instance.
        realm.close();
    }
}

我有一些数据库模式包含几个表。这些表中的数据总是在变化,但我只有一个表需要监听并刷新与该表相关的UI。我不想检查的是,在任何其他领域对象中进行任何小的更新之后,领域中的这些更改是否正好在通缉表中。 你能推荐什么样的最佳实践


共 (2) 个答案

  1. # 1 楼答案

    在Realm拥有细粒度通知之前,我将通过使用ContentObserver、RxJava或您自己的Observer接口来实现自己的通知系统

  2. # 2 楼答案

    正如Christian RxJava所说,他能帮上忙。当然,这是一个可能需要对代码进行重大修改的概念,而不是具体而快速地解决问题。在任何情况下,访问数据库的存储库模式都是良好的做法。您可以使用自己的层来访问Realm。在这种情况下,您可以控制对Realm的查询,并在数据更改时通知观察者

        public interface RealmRepository {
                <T> Observable<T> get(Class clazz, Func1<RealmQuery, RealmQuery> predicate);
                void storeObject(Class clazz, JSONObject jsonObject);
                void storeObjects(Class clazz, JSONArray jsonArray);
                <T> Observable<T> update(Class clazz, Action0 action);
             }
    

    使用Realm interface repository可以确保控制所有请求

    现在,您将获得Observable<T>对象,并可以在数据发生更改时发出通知

        public class RealmRepositoryImpl implements RealmRepository {
    
        Realm realm;
        RealmQueryableCollection realmQueryCollection;
    
        public RealmRepositoryImpl(Realm realm) {
            this.realm = realm;
            this.realmQueryCollection = new RealmQueryableCollection();
        }
    
        @Override
        public <T> Observable<T> get(Class clazz, Func1<RealmQuery, RealmQuery> predicate) {
            BehaviorSubject<T> behaviorSubject = BehaviorSubject.create((T) getInner(clazz, predicate));
            realmQueryCollection.add(clazz, predicate, behaviorSubject);
            return behaviorSubject;
        }
    
        public <T extends RealmObject> RealmResults<T> getInner(Class clazz, Func1<RealmQuery, RealmQuery> predicate) {
            RealmQuery query = realm.where(clazz);
            if (predicate != null)
                query = predicate.call(query);
            return query.findAll();
        }
    
        @Override
        public void storeObject(Class clazz, JSONObject jsonObject) {
            realm.beginTransaction();
            realm.createOrUpdateObjectFromJson(clazz, jsonObject);
            realm.commitTransaction();
            notifyObservers(clazz);
    
        }
    
        @Override
        public void storeObjects(Class clazz, JSONArray jsonArray) {
            realm.beginTransaction();
            realm.createOrUpdateAllFromJson(clazz, jsonArray);
            realm.commitTransaction();
            notifyObservers(clazz);
        }
    
    
        @Override
        public <T> Observable<T> update(Class clazz, Action0 action) {
            return (Observable<T>) Observable.create(subscriber -> {
                realm.beginTransaction();
                action.call();
            }).doOnNext(o -> {
                realm.commitTransaction();
                notifyObservers(clazz);
            });
        }
    
        private void notifyObservers(Class clazz) {
            Observable.from(realmQueryCollection.getQuerables(clazz))
                    .subscribe(realmQuerable ->
                            realmQuerable.getSubject().onNext(getInner(clazz, realmQuerable.getPredicate())));
        }
    }
    

    当makeget query时,只需保存实体(表)、谓词(nicerx.functions.Func1)和主语。当您要更改Realm中的数据时,您可以使用保存的谓词获取更改的数据,并通知所有观察者有关更改的信息

    示例get query

    public Observable<List<Event>> getEvents() {
            return realmRepository.get(Event.class, predicate -> predicate
                            .equalTo("category", "Art")
                            .or()
                            .equalTo("category", "Music"));
        }
    

    在我看来,被动应对是解决这个问题的自然方法

    关于GitHub的完整示例代码您可以尝试使用该示例。目前,这并不是一个完整的解决方案(没有通知取消订阅等),而只是一个想法