Realm 0.87 (for Android) came with a very important change: It introduced detached copies of RealmObject
s. You can create a detached object using Realm.copyFromRealm. Any setter operation on a detached object won’t update the database so they can be called without opening a Realm transaction. In addition the detached objects are accessible from any thread.
We refactored our app code to use repositories and setup the following rules:
- The UI only fetches realm objects via a repository (no more Realm code in Activities).
- Repositories always return detached objects
- Detached objects have to be saved using the
save
method in the repository.
Here’s a simple example repository:
public FooRepository { private Realm realm; public FooRepository(Realm realm) { this.realm = realm; } public Foo getFooById(String fooId) { Foo foo = realm .where(Foo.class) .equalTo("id",fooId) .findFirst(); return realm.copyFromRealm(foo); } public void save(Foo detachedObjectToSave) { // isValid() always returns false on detached objects. if (object.isValid()) { throw new IllegalArgumentException("received realm object is not a detached object"); } realm.beginTransaction(); realm.copyToRealmOrUpdate(object); realm.commitTransaction(); // please note that this also could be saved // in background using Realms asynchronous transactions. } }