2015-08-27 4 views
11

Ich möchte ein RealmObject von seinem Realm zu „lösen“, was bedeutet, dass ich möchte ein RealmObject von einer Methode zurückgeben zu können und in der Lage, es zu benutzen, nachdem ich die closeRealm Instanz.Detach RealmObject von Realm/Managed Convert RealmObject auf nicht verwalteten Objekt

Etwas wie folgt aus:

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

Derzeit getPersonWithId(mContext, personId).getName() einen Fehler zurück, wie erwartet.

Wenn Sie ein verwaltetes Objekt haben, bedeutet dies auch, dass das Objekt unveränderlich ist (kann nicht geändert werden). Daher schlägt jede Methode zur Aktualisierung des Objekts wie person.setName(String name) fehl, da das Objekt ein verwaltetes Objekt ist.

Ich wünschte, es wäre eine Methode, wie Person person = person.detachFromRealm(); sein

jemand eine Lösung/Abhilfe für dieses Problem Kennt?

Antwort

20

Android Realm unterstützt nun das Hinzufügen und Entfernen von Realm-Objekten. So können Sie wie folgt tun:

RealmObject objectCopy = realm.copyFromRealm(RealmObject object); 

Hier sind Details aus der Dokumentation:

Instanzen von Realm-Objekte können entweder verwaltete oder nicht verwaltete werden.

Verwaltete Objekte bleiben in Realm erhalten, sind immer auf dem neuesten Stand und Thread beschränkt. Sie sind in der Regel leichter als die nicht verwaltete Version , da sie weniger Speicherplatz auf dem Java-Heap belegen.

Nicht verwaltete Objekte sind wie normale Java-Objekte, sie sind nicht persistent und sie werden nicht automatisch aktualisiert. Sie können frei über Threads verschoben werden.

Es ist möglich, zwischen den beiden Zuständen mit Realm.copyToRealm() und Realm.copyFromRealm()

3

Es gibt eine Feature-Anforderung für diese here. Dafür gibt es keine wirklich gute Lösung, nur Workarounds.

Eine Problemumgehung ist, die Daten manuell von einem Objekt zu einem anderen zu kopieren. Meine RealmObjects haben Tonnen von Feldern so manuell kopieren die Eigenschaften von einem Objekt zu einem anderen ist ein NO GO.

Anstatt den "Kopiercode" manuell zu schreiben, entschied ich mich für MapStruct. Hier ist ein sandbox Projekt mit Realm und MapStruct. Es scheint gut zu funktionieren, zumindest für einfache Modelle.

+3

Dies ist keine Antwort, sondern ein zusätzliches Detail für Ihre Frage zu konvertieren. Würden Sie bitte Ihre Frage bearbeiten, um dies zu berücksichtigen, und dann diese "Antwort" entfernen? Vielen Dank! – 323go

+1

Ich denke jedoch, dass dies eine gültige Antwort ist, da er die Frage beantwortet "Kennt jemand eine Lösung/Workaround für dieses Problem?". Er stellt eine mögliche Problemumgehung vor und bietet einen Kontext über das Projekt mit einer Feature-Anforderung zu diesem Thema. – Thermometer

+1

Können Sie dies bitte als akzeptierte Antwort entfernen, wurde die Feature-Anfrage implementiert: https://github.com/realm/realm-java/pull/1849 –