gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 08:25:50 25 4
gpt4 key购买 nike

我在 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。当我尝试在方法 getSimpleList() 中将其转换为 Arraylist 时,出现异常:

java.lang.IllegalArgumentException: Only valid managed objects can be copied from Realm.

我无法理解在从 Realm 中保存和检索对象时如何取消管理对象。请纠正我。谢谢。

最佳答案

在我看来你有几个问题:

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

  2. 前三行if ... addAll(bayList);修改TermRealmList。如果对象是托管的,则不能在事务之外执行此操作。当对象托管时,您会收到您描述的错误,因为您正试图将托管对象添加到非托管RealmList

  3. 虽然不是问题,但 RealmObject 已经实现了 RealmModel。说一次,何必再说一次?

编辑添加:

为了将 BayEntity 添加到 TermEntity,首先确保 TermEntity 是一个托管对象(使用 copyToRealm ,或对其进行查询)。一旦你这样做了,updateBayList 中的代码就非常接近正确了。你想要这样的东西:

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

关于java - 只能从 Realm 复制有效的托管对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45321325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com