[JAVA] Vorsichtsmaßnahmen beim Speichern von Daten mit Realm (Unterscheidung zwischen verwaltet / nicht verwaltet, wenn copyToRealm () verwendet werden soll)

Einführung

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.

Lektion: Verstehen Sie den Unterschied zwischen verwaltetem Objekt und nicht verwaltetem Objekt und schreiben Sie Ihren Code

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 ()".

Implementierungsbeispiel: Speichern des ToDo-Objekts (auf zwei Arten)

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)

ToDo-Objektspeichermethode

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.

Beim Speichern eines verwalteten Objekts

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;

Beim Speichern eines nicht verwalteten Objekts

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);

Eine Wortzusammenfassung

Wenn Sie Realm verwenden, schreiben Sie Ihren Code und achten Sie darauf, ob das Objekt "verwaltet" oder "nicht verwaltet" ist.

Recommended Posts

Vorsichtsmaßnahmen beim Speichern von Daten mit Realm (Unterscheidung zwischen verwaltet / nicht verwaltet, wenn copyToRealm () verwendet werden soll)
So beheben Sie einen Absturz beim Löschen von Realm-Daten in der Liste der schnellen Benutzeroberfläche
Verwenden Sie collection_select, um die in Active_Hash gespeicherten Daten abzurufen
Verwendung von JSON-Daten in der WebSocket-Kommunikation (Java, JavaScript)