2016-02-02 22 views
9

レルムオブジェクトのプロパティを別のクラスである別のレルムオブジェクトと設定していますが、エラーが発生しています: '値'は管理対象オブジェクトではありません。レルム例外 'value'は有効な管理対象オブジェクトではありません

realmObject.setAnotherRealmObject(classInstance.returnAnotherRealmObjectWithValues()) 

クラスのインスタンスはanotherRealmObjectコンストラクタを受信して​​、ウィジェットからの値でメソッドを介してそれを返します:

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

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

     return mAnotherRealmObject; 
} 

私は新しい別のレルムを作成していますが、右の道を(と思う)オブジェクト

mAnotherRealmObject = mRealmInstance.createObject(AnotherRealmObject.class); 

これは、通過参照のために既に変更されているanotherRealmObjectを返すためですか?

答えて

13

を介して制御レルムのインスタンスのライフサイクルに関するいくつかのアイデアを得ることができます:

realmObject.isValid(); 

私はrealmObjectをインスタンス化する方法を知っている2つの方法があります。

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

私はparmerを使ってrealmObjectsを渡していました。それが無効になるだろうparcelerを通じてrealmObjectを渡すと、それをアンラップし、realmObject変数に代入:

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

ソリューション1 - レルムオブジェクトを照会し、その後、ユニークな識別子です合格:

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

は、ソリューション2 - 値を渡し、取得し、realmInstanceを通じてrealmObjectを作成し、値を割り当てます。

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

この方法では、無効なレルムオブジェクトは取得されません。

+1

'RealmObject realmObj = new RealObject();'でオブジェクトを作成すると、Realmによって管理されていないスタンドアロンの 'RealmObject'が実際に作成されています。 'realmObj = realm.copyTorealm(realmObj)'を使って、管理対象のRealmオブジェクトのインスタンスを取得することができます。プライマリキーを渡してから、スタンドアロンオブジェクトをパーセル経由で渡すよりもオブジェクトのクエリを実行する方がよいでしょう。レルムのプライマリキーを使用したクエリは超高速でなければなりません。 https://realm.io/docs/java/latest/#intentsを参照してください。 – beeender

1

すべてRealmObjectsおよびRealmResultsは、特定のレルムインスタンスに属します。対応するRealmインスタンスが閉じられると、RealmObjectは無効になります。

場合、以下のように:

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

あなたはそれが有効であるかどうかを確認するレルムオブジェクトのメソッドがある研究をしたら、このdoc

+0

こんにちは、あなたは本当に良い点を持っていますが、最初にJavaの文書全体を読んでみたいと思います。私が使用していた領域のインスタンスを閉じていなかったことを指摘したいと思います。私のエラーの原因。 –

+1

まだRealmインスタンスへの参照を保持していますか?それがGCedになると、問題が起こる可能性もあります。 – beeender

+0

こんにちは@beender、私は問題と解決策を見つけました。私は答えを投稿します。 –

関連する問題