我在Realm中有一对多的关系
public class BayEntity extends RealmObject implements RealmModel {
@PrimaryKey
private int id;
private String title;
}
public class TermEntity extends RealmObject implements RealmModel {
@PrimaryKey
private String termId;
private String name;
private RealmList<BayEntity> bayList;
public void updateBayList(ArrayList<BayEntity> bayList) {
if(CollectionUtility.isEmptyOrNull(this.bayList))
this.bayList = new RealmList();
this.bayList.addAll(bayList);
realm.beginTransaction();
realm.copyToRealm(this.bayList);
realm.insertOrUpdate(this); //update current instance
realm.commitTransaction();
}
public ArrayList<BayEntity> getSimpleList() {
if(CollectionUtility.isEmptyOrNull(bayList))
return new ArrayList<>();
return (ArrayList<BayEntity>) realm.copyFromRealm(bayList);
}
}
我将包含baylist的所有TermEntity
个对象设为:
public RealmResults<TermEntity> getTerms() {
return realm.where(TermEntity.class).findAll();
}
我能够成功保存并检索bayList
。当我尝试将其转换为方法Arraylist
中的getSimpleList()
时,我会遇到异常:
java.lang.IllegalArgumentException:只能使用有效的托管对象 从Realm复制。
我无法理解在从领域保存和检索对象时如何对象不受管理。请指正。感谢。
答案 0 :(得分:3)
在我看来,好像你有几个问题:
您在哪里获得了Realm
方法中使用的updateBayList
实例?由于它是实例本地状态,因此可能很容易引用在当前上下文(时间或线程)中无效的域
前三行if ... addAll(bayList);
修改Term
s RealmList
。如果管理对象,则无法在事务之外执行此操作。当对象不托管时,您会收到您描述的错误,因为您尝试将托管对象添加到未托管的RealmList
虽然不是问题,RealmObject
已经实现了RealmModel
。说一次,为什么再说一遍?
已编辑添加:
要将BayEntity
添加到TermEntity
,请首先确保TermEntity
是托管对象(使用copyToRealm
或查询)。完成后,updateBayList
中的代码几乎是正确的。你想要这样的东西:
realm.beginTransaction();
if (CollectionUtility.isEmptyOrNull(this.bayList)) {
this.bayList = new RealmList();
}
this.bayList.addAll(bayList);
realm.commitTransaction();