只能从Realm复制有效的托管对象

时间:2017-07-26 08:24:34

标签: java android realm

我在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复制。

我无法理解在从领域保存和检索对象时如何对象不受管理。请指正。感谢。

1 个答案:

答案 0 :(得分:3)

在我看来,好像你有几个问题:

  1. 您在哪里获得了Realm方法中使用的updateBayList实例?由于它是实例本地状态,因此可能很容易引用在当前上下文(时间或线程)中无效的域

  2. 前三行if ... addAll(bayList);修改Term s RealmList。如果管理对象,则无法在事务之外执行此操作。当对象托管时,您会收到您描述的错误,因为您尝试将托管对象添加到未托管的RealmList

  3. 虽然不是问题,RealmObject已经实现了RealmModel。说一次,为什么再说一遍?

  4. 已编辑添加:

    要将BayEntity添加到TermEntity,请首先确保TermEntity是托管对象(使用copyToRealm或查询)。完成后,updateBayList中的代码几乎是正确的。你想要这样的东西:

        realm.beginTransaction();
        if (CollectionUtility.isEmptyOrNull(this.bayList)) {
            this.bayList = new RealmList();
        }
        this.bayList.addAll(bayList);
        realm.commitTransaction();