Kurz nachdem ich angefangen hatte, Realm zu verwenden, schrieb ich Code, ohne die Rolle von "copyToRealm ()" zu verstehen, was eine Reihe von Fehlern verursachte. Dies ist der Artikel, den ich zu diesem Zeitpunkt lesen möchte.
Es gibt zwei Muster von Realm-Objekten: "ManagedObject" und "UnmanagedObject". In dieser Hinsicht enthält die offizielle Realm-Dokumentation (https://realm.io/docs/java/latest/) (Realm Java 5.9.1) die folgende Erklärung:
Instances of Realm objects can be either managed or unmanaged.
Managed objects are persisted in Realm, are always up to date and thread confined. They are generally more lightweight than the unmanaged version as they take up less space on the Java heap. Unmanaged objects are just like ordinary Java objects, they are not persisted and they will not be updated automatically. They can be moved freely across threads. It is possible to convert between the two states using Realm.copyToRealm and Realm.copyFromRealm.
Hier ist eine leicht modifizierte Version des oben genannten, nachdem Sie die Google-Übersetzung angewendet haben.
Die Instanz des Realm-Objekts kann entweder ** verwaltet ** (= verwaltet) oder ** nicht verwaltet ** (= nicht verwaltet) sein. ** ManagedObject ** bleibt in Realm erhalten, immer aktuell und Thread-beschränkt. Sie sind im Allgemeinen leichter als ** UnmanagedObject **, da sie weniger Speicherplatz auf dem Java-Heap beanspruchen. ** UnmanagedObject ** ist genau das gleiche wie ein reguläres Java-Objekt. Es ist nicht dauerhaft und wird nicht automatisch aktualisiert. Diese können frei zwischen den Fäden bewegt werden. Sie können mit Realm.copyToRealm und Realm.copyFromRealm zwischen den beiden Zuständen wechseln.
Der Punkt ist Dies bedeutet, dass der Wert von "UnmanagedObject" nicht automatisch aktualisiert wird. Verwenden Sie daher "Realm.copyToRealm ()".
Angenommen, Sie möchten, dass Realm die folgenden Klassen verwaltet:
public class ToDo extends RealmObject{
//Titel
public String title;
//Datum
public String updateDate;
//Inhalt
public String content;
//Ist das Kontrollkästchen aktiviert?
public boolean isChecked;
}
Wenn Sie ein Objekt dieser ToDo-Klasse ** zuerst ** implementieren, kann es entweder "ManagedObject" oder "UnmanagedObject" sein.
//Als verwaltetes Objekt implementiert
ToDo todo = realm.createObject(ToDo.class);
//Als nicht verwaltetes Objekt implementiert
ToDo todo = new ToDo();
Denn wie im Zitat im offiziellen Dokument bereits erwähnt, können Sie "UnmanagedObject" in der Mitte des Prozesses in "ManagedObject" ändern, indem Sie "Realm.copyToRealm ()" verwenden und "ManagedObject" ändern. Wenn Sie es in "UnmanagedObject" ändern möchten, können Sie es mit "Realm.copyFromRealm ()" lösen.
In den meisten Realm-Einführungsartikeln wird es jedoch als "ManagedObject" implementiert. (Selbstprüfung)
Beim Speichern des Werts eines Objekts muss unterschieden werden, ob das Objekt "ManagedObject" oder "UnmanagedObject" ist.
Als Beispiel haben wir eine ToDo-Objektspeichermethode save ()
vorbereitet.
Schauen Sie sich zunächst das folgende Framework an.
Rahmen der Speichermethode
public void save(final String title, final String updateDate, final String content){
realm.executeTransaction(new Realm.Transaction(){
@Override
public void execute(Realm bgRealm){
//Schreiben Sie den Prozess, um den Wert hier zu speichern.
}
});
}
In diesem Rahmen ist es notwendig, die Verarbeitung entsprechend dem Zustand des Objekts zu schreiben.
Der Wert von "ManagedObject" wird automatisch aktualisiert, sodass Sie dasselbe wie bei einem normalen Java-Objekt tun können.
Verarbeitung im Rahmen
ToDo todo = realm.createObject(ToDo.class);
//Ersetzen Sie den Wert, den Sie speichern möchten
todo.title = title;
todo.updateDate = updateDate;
todo.content = content;
Der Wert von "UnmanagedObject" wird nicht automatisch aktualisiert, daher müssen Sie am Ende "Realm.copyToRealm ()" verwenden.
Verarbeitung im Rahmen
ToDo todo = new ToDo();
//Ersetzen Sie den Wert, den Sie speichern möchten
todo.title = title;
todo.updateDate = updateDate;
todo.content = content;
//Wechseln Sie von nicht verwaltetem Objekt zu verwaltetem Objekt und kopieren Sie es in Realm
realm.copyToRealm(todo);
Wenn Sie Realm verwenden, schreiben Sie Ihren Code und achten Sie darauf, ob das Objekt "verwaltet" oder "nicht verwaltet" ist.
Recommended Posts