Je suis en train de définir une propriété sur un objet de domaine avec un autre objet de domaine qui est une classe différente, mais je reçois l'erreur: 'valeur' n'est pas un objet géré.
realmObject.setAnotherRealmObject(classInstance.returnAnotherRealmObjectWithValues())
L'instance de la classe reçoit le constructeur anotherRealmObject et le renvoie via la méthode avec les valeurs des widgets:
public ClassInstance(AnotherRealmObject anotherRealmObject){
mAnotherRealmObject = anotherRealmObject;
}
public AnotherRealmObject returnAnotherRealmObjectWithValues(){
mAnotherRealmObject.setId(RandomUtil.randomNumbersAndLetters(5));
mAnotherRealmObject.setName(etName.getText().toString());
return mAnotherRealmObject;
}
Je crée le nouveau Another Realm Object de la bonne façon (je pense):
mAnotherRealmObject = mRealmInstance.createObject(AnotherRealmObject.class);
Est-ce parce que je retourne un autre objetRealmObject dans lequel il est déjà modifié en raison de la référence de passage?
Lors de la recherche, il existe une méthode sur les objets du domaine pour vérifier sa validité:
realmObject.isValid();
Je sais comment instancier un objet realmObject de deux manières:
RealmObject realmObj = new RealObject(); //Invalid
RealmObject realmObj = realmInstance().createObject(RealmClass.class); //Valid
J'utilisais parceler pour faire passer realmObjects. Passer un objet realmObject dans un colis, le dérouler et l'assigner à une variable realmObject le rendrait invalide:
RealmObject realmObj = Parcels.unwrap(data.getParcelableExtra("realmObject"));
Solution 1 - Transmettez l'identificateur unique, puis interrogez l'objet royaume:
int uniqueId = Parcels.unwrap(data.getParcelableExtra("uniqueId"));
Solution 2: transmettez les valeurs, récupérez-les, créez un objet realm via une instanceInstance et affectez les valeurs.
//Retrieve values
String value1 = Parcels.unwrap(data.getParcelableExtra("value1"));
String value2 = Parcels.unwrap(data.getParcelableExtra("value2"));
//Create realmObject 'properly'
RealmObject realmObj = realmInstance().createObject(RealmClass.class);
//Assign retrieved values
realmObj.setValue1(value1);
realmObj.setValue2(value2);
De cette façon, vous n'obtiendrez pas d'objet royaume invalide.
Tous les RealmObjects
et RealmResults
gérés appartiennent à une instance de royaume spécifique. Une fois que l'instance de royaume correspondante est fermée, la variable RealmObject
devient invalide.
Comme ci-dessous cas:
Realm realm = Realm.getInstance(context);
realm.beginTransaction();
MyObject obj = realm.createObject(MyObject.class);
realm.commitTransaction();
realm.close();
realm = Realm.getInstance(context);
realm.beginTransaction();
MyObject obj2 = realm.where(MyObject2.class).findFirst();
obj2.setObj1(obj); // Throws exception, because of the obj's Realm instance is closed. It is invalid now.
realm.commitTransaction();
Vous pouvez avoir des idées sur le contrôle du cycle de vie des instances du royaume à travers ceci doc
Pour un objet géré, un objet que vous souhaitez définir en tant qu'objet lié doit également être un objet RealmObject géré.
Par exemple, la valeur de retour de realm.copyToRealm (blah) ou autre.