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à.
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.
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 utilisant
Realm.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)
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.
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;
La valeur de ʻUnmanagedObject n'est pas mise à jour automatiquement, vous devez donc utiliser
Realm.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);
Lorsque vous utilisez Realm, écrivez votre code en veillant à savoir si l'objet est «Managed» ou «Unmanaged».
Recommended Posts