Realm Exception'value'不是有效的托管对象

时间:2016-02-02 03:45:02

标签: android realm

我在一个领域对象上设置一个属性,另一个领域对象是另一个类,但是我得到了错误:'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);

是不是因为我正在返回另一个因为传递引用而已被修改的另一个对象?

3 个答案:

答案 0 :(得分:20)

在研究领域时,有一种方法可以检查领域对象是否有效:

realmObject.isValid();

我知道如何实例化realmObject有两种方法:

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

我正在使用parceler来传递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 :(得分:2)

所有托管RealmObjectsRealmResults都属于特定的Realm实例。相应的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

获得有关控制Realm实例生命周期的一些想法

答案 2 :(得分:0)

对于托管对象,要设置为链接对象的对象也必须也是托管RealmObject。

例如realm.copyToRealm(blah)的返回值。