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