Realm.io notifications – 如何只监听某些表中的更改?

我在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。 我不想检查在任何其他Realm对象中的任何小更新之后,Realm中的这些更改完全在想要的表中。 您可以建议哪些最佳做法?

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

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

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

使用Realm接口存储库可以确保您控制所有请求。

现在您将获得Observable对象,并可以通知数据是否已更改。

  public class RealmRepositoryImpl implements RealmRepository { Realm realm; RealmQueryableCollection realmQueryCollection; public RealmRepositoryImpl(Realm realm) { this.realm = realm; this.realmQueryCollection = new RealmQueryableCollection(); } @Override public  Observable get(Class clazz, Func1 predicate) { BehaviorSubject behaviorSubject = BehaviorSubject.create((T) getInner(clazz, predicate)); realmQueryCollection.add(clazz, predicate, behaviorSubject); return behaviorSubject; } public  RealmResults getInner(Class clazz, Func1 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  Observable update(Class clazz, Action0 action) { return (Observable) 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()))); } } 

当make get query你只需保存实体(表),谓词(nice rx.functions.Func1 )和subject。 当您更改Realm的数据时,您可以使用保存的谓词获取更改的数据,并通知所有观察者的更改。

示例get query

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

在我看来,反应式方法是解决这个问题的自然方法。

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