2016-02-02 4 views
9

Sto impostando una proprietà su un oggetto realm con un altro oggetto realm che è una classe diversa, tuttavia viene visualizzato l'errore: 'valore' non è oggetto gestito non valido .Il "valore" di eccezione del reame non è un oggetto gestito valido

realmObject.setAnotherRealmObject(classInstance.returnAnotherRealmObjectWithValues()) 

L'istanza di classe riceve costruttore anotherRealmObject e lo restituisce attraverso il metodo con i valori da widget:

public ClassInstance(AnotherRealmObject anotherRealmObject){ 
    mAnotherRealmObject = anotherRealmObject; 
} 

public AnotherRealmObject returnAnotherRealmObjectWithValues(){ 
     mAnotherRealmObject.setId(RandomUtil.randomNumbersAndLetters(5)); 
     mAnotherRealmObject.setName(etName.getText().toString()); 

     return mAnotherRealmObject; 
} 

sto creando il nuovo un altro regno oggetto la strada giusta (credo):

mAnotherRealmObject = mRealmInstance.createObject(AnotherRealmObject.class); 

È perché sto restituendo anotherRealmObject in cui è già stato modificato a causa del riferimento di passaggio?

risposta

13

Al ricerca c'è un metodo su reame oggetti per controllare se è valido:

realmObject.isValid(); 

ci sono due modi che conosco come creare un'istanza di un realmObject:

RealmObject realmObj = new RealObject(); //Invalid 
RealmObject realmObj = realmInstance().createObject(RealmClass.class); //Valid 

Stavo usando il parceler per passare a realmObjects. Il passaggio di un realmObject attraverso parceler e l'apertura e l'assegnazione a una variabile realmObject renderebbe invalida:

RealmObject realmObj = Parcels.unwrap(data.getParcelableExtra("realmObject")); 

Soluzione 1 - Passare l'identificatore unico, quindi interrogare l'oggetto regno:

int uniqueId = Parcels.unwrap(data.getParcelableExtra("uniqueId")); 

Soluzione 2 - Passa i valori, recuperali, crea un realmObject attraverso un realmInstance e assegna i valori.

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

In questo modo non si ottiene un oggetto regno non valido.

+1

Quando create object con 'RealmObject realmObj = new RealObject();', in realtà sta creando un 'RealmObject' autonomo che non è ancora gestito da Realm. Puoi usare 'realmObj = realm.copyTorealm (realmObj)' per ottenere un'istanza dell'oggetto Realm gestito. È meglio passare la chiave primaria e poi interrogare l'oggetto piuttosto che passare l'oggetto autonomo tramite pacco. La query con la chiave primaria in Realm dovrebbe essere super veloce. Vedi https://realm.io/docs/java/latest/#intents – beeender

1

Tutte gestite RealmObjects e RealmResults appartengono a un'istanza di Realm specifica. Dopo che l'istanza di Realm corrispondente viene chiusa, RealmObject diventa non valido.

come di seguito caso:

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

è possibile ottenere alcune idee su controllo del ciclo di vita esempio del Reame attraverso questo doc

+0

Ciao @beender, mentre tu hai alcuni punti davvero buoni, e vorrei leggere prima tutto il documento java, vorrei sottolineare che non stavo chiudendo l'istanza del realm che stavo usando quindi probabilmente non è il causa del mio errore. –

+1

Tieni ancora un riferimento all'istanza di Realm? Se riceve GCed, potrebbe verificarsi anche il problema. – beeender

+0

Ciao @beender, ho trovato il problema e la soluzione. Posterò la risposta –