簡體   English   中英

Realm.io [Java] notifications - 如何僅在某些表中監聽更改?

[英]Realm.io [Java] notifications - How to listen for changes only in certain Table?

我在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 {
            <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接口存儲庫可以確保您控制所有請求。

現在您將獲得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())));
    }
}

當make get query你只需保存實體(表),謂詞(nice rx.functions.Func1 )和subject。 當您更改Realm的數據時,您可以使用已保存的謂詞獲取已更改的數據,並通知所有觀察者的更改。

示例get query

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

在我看來,反應式方法是解決這個問題的自然方法。

GitHub上的完整示例代碼,您可以嘗試使用該示例。 目前它不是完整的解決方案(沒有通知取消訂閱等),而只是一個想法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM