Отделить RealmObject от Realm/Convert управляемого RealmObject до неуправляемого объекта

Я хочу "отсоединить" RealmObject от Realm, что означает, что я хочу вернуть RealmObject из метода и иметь возможность использовать его после я close Realm экземпляр.

Что-то вроде этого:

public Person getPersonWithId(final Context context, final String personId){
    Realm realm = Realm.getInstance(context);
    Person person = realm.where.....;
    realm.close();
    return person;
}

В настоящее время getPersonWithId(mContext, personId).getName() вернет ошибку, как и ожидалось.

Наличие управляемого объекта также означает, что объект является неизменным (не может быть изменен), и поэтому любой метод, обновляющий объект, такой как person.setName(String name), завершится сбоем из-за того, что объект является управляемым объектом.

Я бы хотел, чтобы был такой метод, как Person person = person.detachFromRealm();

Кто-нибудь знает решение/обходной путь для этой проблемы?

Ответ 1

Android realm теперь поддерживает привязку и удаление объекта realm. Таким образом, вы можете сделать следующее:

RealmObject objectCopy = realm.copyFromRealm(RealmObject object);

Вот подробности из документации:

Экземпляры объектов Realm могут быть либо управляемыми, либо неуправляемыми.

Управляемые объекты сохраняются в Realm, всегда обновляются и поток ограничен. Они, как правило, более легкие, чем неуправляемая версия, поскольку они занимают меньше места на куче Java.

Неуправляемые объекты похожи на обычные объекты Java, они не являются сохраняются, и они не будут обновляться автоматически. Они могут быть свободно перемещается по потокам.

Можно преобразовать между двумя состояниями, используя Realm.copyToRealm() и Realm.copyFromRealm()

Ответ 2

Здесь есть запрос функции здесь. Для этого нет реального отличного решения, только обходные пути.

A обходной путь - это вручную копировать данные с одного объекта на другой. У моего RealmObjects есть тонны полей, поэтому вручную копирование свойств из одного объекта в другое является НЕТ GO.

Вместо того, чтобы вручную писать "код копирования", я решил использовать MapStruct. Здесь sandbox проект с Realm и MapStruct. Кажется, что все работает отлично, по крайней мере, для простых моделей.