[JAVA] Précautions lors de l'enregistrement de données avec Realm (distinction entre Managed / Unmanaged, quand utiliser copyToRealm ())

introduction

Peu de temps après avoir commencé à utiliser Realm, j'ai écrit du code sans comprendre le rôle de copyToRealm (), ce qui a causé une série de bogues. C'est l'article que je veux lire à ce moment-là.

Leçon: comprendre la différence entre un objet géré et un objet non géré et rédiger votre code

Il existe deux modèles d'objets Realm, ManagedObject et ʻUnmanagedObject`. À cet égard, la documentation officielle du royaume (https://realm.io/docs/java/latest/) (Realm Java 5.9.1) contient l'explication suivante:

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.

Voici une version légèrement modifiée de ce qui précède après l'application de la traduction Google.

L'instance de l'objet Realm peut être soit ** Managed ** (= managed) soit ** Unmanaged ** (= unmanaged). ** ManagedObject ** est conservé dans Realm, toujours à jour et limité par les threads. Ils sont généralement plus légers que ** UnmanagedObject ** car ils occupent moins d'espace sur le tas Java. ** UnmanagedObject ** est exactement le même qu'un objet Java standard. Il n'est pas persistant et ne sera pas mis à jour automatiquement. Ceux-ci peuvent être librement déplacés entre les threads. Vous pouvez basculer entre les deux états à l'aide de Realm.copyToRealm et Realm.copyFromRealm.

Le point est Cela signifie que vous devez utiliser Realm.copyToRealm () selon le cas, car la valeur de ʻUnmanagedObject` n'est pas mise à jour automatiquement.

Exemple d'implémentation: enregistrement d'un objet ToDo (2 façons)

Par exemple, supposons que vous souhaitiez que Realm gère les classes suivantes:


public class ToDo extends RealmObject{
    //Titre
    public String title;
    //Date
    public String updateDate;
    //Contenu
    public String content;
    //La case à cocher est-elle cochée?
    public boolean isChecked;    
}

Lors de l'implémentation d'un objet de cette classe ToDo ** d'abord **, il peut s'agir de ManagedObject ou de ʻUnmanagedObject`.

                //Implémenté en tant qu'objet géré
                ToDo todo = realm.createObject(ToDo.class);

                //Implémenté en tant qu'objet non géré
                ToDo todo = new ToDo();

Parce que, comme mentionné dans la citation du document officiel plus tôt, si vous voulez changer ʻUnmanagedObject en ManagedObjectau milieu du traitement, vous pouvez le résoudre en utilisantRealm.copyToRealm (), et vous pouvez le résoudre en utilisant ManagedObject. Si vous voulez le changer en ʻUnmanagedObject, vous pouvez le résoudre en utilisantRealm.copyFromRealm ().

Cependant, la plupart des articles d'introduction à Realm l'implémentent comme ManagedObject. (Auto-examen)

Méthode d'enregistrement des objets ToDo

Lors de l'enregistrement de la valeur d'un objet, il est nécessaire de distinguer si l'objet est «ManagedObject» ou «UnmanagedObject».

A titre d'exemple, nous avons préparé une méthode de sauvegarde d'objet ToDo save ().

Tout d'abord, jetez un œil au cadre suivant.

cadre de la méthode de sauvegarde


    public void save(final String title, final String updateDate, final String content){
        realm.executeTransaction(new Realm.Transaction(){
            @Override
            public void execute(Realm bgRealm){

                //Écrivez le processus pour enregistrer la valeur ici.

            }
        });
    }

Dans ce cadre, il est nécessaire d'écrire le traitement en fonction de l'état de l'objet.

Lors de l'enregistrement d'un objet géré

La valeur de ManagedObject est mise à jour automatiquement, vous pouvez donc faire la même chose qu'un objet Java normal.

Traitement dans le cadre


                ToDo todo = realm.createObject(ToDo.class);
                //Remplacez la valeur que vous souhaitez enregistrer
                todo.title = title;
                todo.updateDate = updateDate;
                todo.content = content;

Lors de l'enregistrement d'un objet non géré

La valeur de ʻUnmanagedObject n'est pas mise à jour automatiquement, vous devez donc utiliserRealm.copyToRealm () ʻà la fin.

Traitement dans le cadre



                ToDo todo = new ToDo();
                //Remplacez la valeur que vous souhaitez enregistrer
                todo.title = title;
                todo.updateDate = updateDate;
                todo.content = content;
                //Passer de UnmanagedObject à ManagedObject et copier dans Realm
                realm.copyToRealm(todo);

Un mot résumé

Lorsque vous utilisez Realm, écrivez votre code en veillant à savoir si l'objet est «Managed» ou «Unmanaged».

Recommended Posts

Précautions lors de l'enregistrement de données avec Realm (distinction entre Managed / Unmanaged, quand utiliser copyToRealm ())
Comment réparer un crash lors de la suppression de données de royaume dans la liste de l'interface utilisateur Swift
Utilisez collection_select pour extraire les données stockées dans Active_Hash
Comment utiliser les données JSON dans la communication WebSocket (Java, JavaScript)