realm-java: Object changelisteners does not trigger if a linked object changes

Goal

Detect changes of nested objects of a single RealmObject using RealmChangeListener . Understand the differences between RealmChangeListener on RealmObject and RealmResults.

Expected Results

RealmChangeListener of a single RealmObject would listen to changes of its nested objects. RealmChangeListener of a single RealmObject would listen to more changes than the RealmChangeListener of RealmResults.

Actual Results

RealmChangeListener of a single RealmObject doesn’t listen to changes of its nested objects. RealmChangeListener of RealmResults listens to changes of its children’s nested objects.

Steps & Code to Reproduce

I created a simple Android project to reproduce my use case: https://github.com/jpmcosta/RealmTestProject/tree/262ee9099b47852c2b26bc2f7e3874c8670e6264

Schema:

  • App object contains a RealmColor property. That’s just a (bad) pattern to illustrate the issue.

How to reproduce the issue:

  • there’s a list with a single App object
  • click on that object to randomly change the value of its RealmColor property
  • when RealmColor.value changes we want to:
    • change the App text color
    • change the FAB color

To change the App text color we add RealmChangeListener to RealmResults<App> and call notifyDatasetChanged when a change is detected. To change the FAB color we add a RealmChangeListener to the App object and update its color when a change is detected.

Issue:

  • The FAB color is not updated properly.

Version of Realm and tooling

Realm version: 3.3.2

About this issue

  • Original URL
  • State: open
  • Created 7 years ago
  • Reactions: 11
  • Comments: 39 (18 by maintainers)

Commits related to this issue

Most upvoted comments

@Zhuinden yes, that would work. I understand that App itself has not changed. But then, why does the RealmChangeListener in RealmResults<App> detect a change? Also, if I have 10 nested objects, should I need to add 10 different listeners?

we’re not sure why it worked for me but it did

You probably were updating the parent object in the same transaction, without really thinking about it.

I want to get notified, when a nested object changes. Is this possible?

My ugly solution is to update the parent object “manually”. Usually, I have an updatedAt: Long property in the parent, which the child object is responsible to update whenever it is updated.

Any solution I have the same problem, there is object class with field RealmList, listener on query of the highest hierarchy object with findAllAsync, but not register changes on the the field RealmList, and the results of the query, when I get RealmList from the object is very messed. With query with findAll is worked correctly.

I’ve come along this and want to get notified if a nested object changes (so I can update the UI showing the nested object).

I had the listener attached to RealmObject (just like in the question here) which does not work (as mentioned) but when using findAllAsync() to get a RealmResult it doesn’t get notified either.

So no luck for me using this workaround 😢. I’m using Realm 2.0.1 4.3.0.


Has this changed lately? How can I get notified about changed on nested objects?

Is it related to the use of findAllAsync() instead of the normal findAll()? I’ve linked the async-result to be a LiveData so it can be used with a ViewModel (which works nice except of this nested-listener-problem).

I believe we have an issue somewhere for listening to specific fields, including linked fields. That sounds like something similar to this. I’ll try to find it.

Thanks for your help, but I’m still not sure about using a query to keep a deep listener on the first item of a list. That would require to requery every time the first item changes (it’s common), and I’m not sure about the implications on performance. I still think it would be best to have a parameter to specify whether or not the listener should detect nested objects changes, but that would require some changes to realm-java. Thanks for the answer. 🙂

Edit: if you don’t think it’s worth discussing RealmChangeListener behavior at the current time, feel free to close the issue, as my use case is already solved. 👍

Well as you said, you could also refer to your single object with a RealmResults and then you’ll get nested link notifications, as specified in that comment I linked.

Of course, I personally don’t know why this is how the notification behavior works.