Realm.io[Java]通知-如何仅侦听特定表中的更改?

Realm.io[Java]通知-如何仅侦听特定表中的更改?,java,android,database,realm,Java,Android,Database,Realm,我在RealmJava文档中看到了这个示例代码 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 realmListen

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

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。我不想检查的是,在任何其他领域对象中进行任何小的更新之后,领域中的这些更改是否正好在想要的表中。
您可以建议什么样的最佳实践?

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

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

    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);
         }
在我看来,被动应对是解决这个问题的自然方法


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

非常感谢!现在,当我理解rxJava时,您的回答非常精彩!酷!也许你会对关于RxJava bit.ly/andr-rx(俄语lang)的gitter聊天感兴趣
    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())));
    }
}
public Observable<List<Event>> getEvents() {
        return realmRepository.get(Event.class, predicate -> predicate
                        .equalTo("category", "Art")
                        .or()
                        .equalTo("category", "Music"));
    }