Прослушиватель изменений RealmObject

Я пытаюсь понять типы уведомлений в Realm из раздела «Уведомления» в официальных документах, и когда я использую RealmObject addChangeListener в нескольких управляемых объектах, все они вызываются, когда изменяется только один объект.

это мой код

Person first = realm.where(Person.class).equalTo("id", 0).findFirst();

first.addChangeListener(new RealmChangeListener<Person>() {
    @Override
    public void onChange(Person person) {
        Log.e(LOG_TAG, "First element is changing: " + person);
    }
});

Person second = realm.where(Person.class).equalTo("id", 1).findFirst();

second.addChangeListener(new RealmChangeListener<Person>() {
    @Override
    public void onChange(Person person) {
        Log.e(LOG_TAG, "Second person is changing: " + person);
    }
});

Когда я запускаю обновление в любом из этих объектов Person (например, в первом), вызываются оба слушателя.

Вот что говорят официальные документы:

Слушатели также могут быть присоединены к экземплярам RealmObject, а также к экземплярам RealmResults. Это позволяет вам реагировать на изменения ваших объектов и результатов запроса.

А также

Наконец, прослушиватели изменений на основе типов будут получать уведомления при изменении их типов, на которые они ссылаются.

Насколько я понимаю, наблюдаемое поведение согласуется со вторым определением, но мне нужно использовать первое поведение, то есть я хочу получать уведомления, когда объект, соответствующий этому слушателю, изменяется. Таким образом, если обновляется first Person, уведомляется только соответствующий слушатель, а не все слушатели Person.


person juanes666    schedule 17.06.2016    source источник


Ответы (3)


Прямо сейчас это происходит потому, что наше обнаружение изменений недостаточно детализировано. Это вызовет прослушиватели изменений для всех объектов одного типа, а не только для тех, которые изменились.

Получение уведомлений об изменениях только в том случае, если точный объект отслеживается здесь https://github.com/realm/realm-java/issues/989.

person Christian Melchior    schedule 18.06.2016
comment
Спасибо за ответ! Я нашел много других, говорящих это, но некоторые из них были достаточно старыми, чтобы я их проигнорировал из-за того, что я прочитал в официальной документации. Спасибо еще раз! - person juanes666; 18.06.2016

Используйте findFirstAsync(), который возвращает пустую и недействительную модель realmModel. Вот как вы можете получать обновления с помощью addChangeListener().

person Juan Mendez    schedule 23.03.2017

Теперь поддерживается конкретный прослушиватель изменений.

официальный релиз!

Демо

person Aks4125    schedule 25.10.2017