gpt4 book ai didi

java - 如何持久保存引用的 RealmObject

转载 作者:行者123 更新时间:2023-11-30 05:20:21 24 4
gpt4 key购买 nike

考虑以下 RealmObject 子类

public class TimeSlot extends RealmObject
{
@PrimaryKey
private int value = 0;
private int hits = 0;

@LinkingObjects("ats") private final RealmResults<Visit> visits = null;

public TimeSlot(){}

public TimeSlot(int time)
{
super();
value = time;
}

...
}

public class Visit extends RealmObject
{
private RealmList<TimeSlot> timeslots = null;

public Visit()
{
super();
timeslots = new RealmList<TimeSlot>();
}

public void addTimeSlot(TimeSlot ts) throws Exception
{
this.timeslots.add(ts);
try
{
myRealm.beginTransaction();
myRealm.copyToRealmOrUpdate(this,ImportFlag.valueOf("CheckSameValuesBeforeSet"));
myRealm.commitTransaction();
}
catch(Exception e)
{
myRealm.cancelTransaction();
throw e;
}
}
}

在我的代码的其他地方我执行以下操作

myVisit.addTimeSlot(new TimeSlot(30));

将新的 TimeSlot 添加到 Visit 对象 myVisit 的现有实例。您会注意到,在 addTimeSlot 中,我将修改后的 Visit 实例复制到 Realm。我的问题 - 这样做也会保留新创建的 TimeSlot 对象吗?

一个相关问题 - 当我从 Realm 检索 myVisit 时,是否可以保证 myVisit.timeslots 中的 TimeSlot 对象的顺序与我添加它们时的顺序相同?

最佳答案

您的大部分问题都可以在 Realm 文档中找到答案,如果您知道去哪里查找。很多这样的问题都在主要文档中得到了暗示,然后你需要找到正确的 API 页面。有时只是尝试一下。

You will note that in addTimeSlot I am copying the modified Visit instance to Realm. My question - doing so will also persist the freshly created TimeSlot object?

这是正确的。 copyToRealmOrUpdate 的文档状态:“这是深度复制或更新,即所有引用的对象都将被复制或更新。”

不过,您已经引入了一个潜在的问题。 addTimeSlot 的第一行立即修改 Visit 对象。如果 Visit 对象不受托管,或者您在 addTimeSlot 调用之外启动了 Realm 事务,那么这很好。但如果情况并非如此,那么您将收到有关“尝试在写入事务之外修改对象”的异常。您的方法依赖于您始终在对象的非托管版本上进行操作,并手动将每个更改复制回 Realm 。这并不是真正推荐的方法,因为您引入了对象不同步的可能性。最好始终处理托管对象。

您还访问一个名为 myRealm 的变量,我认为它是对您的 Realm 的全局引用。请注意,对于托管对象,您可以访问 getRealm() 函数来检索对象的 Realm 并避免全局/传递参数。

所以,更好的是:-

  1. 在创建 Realm 时将Visit 添加到 Realm
  2. addTimeSlot 中,使用 getRealm() 的结果来验证 Visit 是否受到管理。如果是这样,请将 TimeSlot 添加到 Realm 和 RealmList。

我对您的 TimeSlot 主键的工作原理感兴趣。

无论如何,回到你的问题。

when I retrieve myVisit from Realm is there a guarantee that the TimeSlot objects in myVisit.timeslots will be in the same order as when I added them?

是的。 RealmList 已排序。您可以将元素添加到末尾,也可以通过使用 RealmList 插入来添加。如果没有存储订单,这显然是多余的。请参阅the docs .

The docs mention that unmanaged objects are like simple POJOs. From what I understand if I create a RealObject subclass instance and never bother copying it to a Realm it will stay "unmanaged".

正确。

But then what happens if I add it to a RealmList instance that is part of a "managed" RealmObject?

这已被讨论here 。那么您的列表就是一个托管 Realm 列表,并且此声明适用:

It is possible to add unmanaged objects to a RealmList that is already managed. In that case the object will transparently be copied to Realm using Realm.copyToRealm(RealmModel, ImportFlag...) or Realm.copyToRealmOrUpdate(RealmModel, ImportFlag...) if it has a primary key.

请注意,您对该对象的现有引用是对该对象的非托管版本,因此请小心。更改其字段不会更改托管版本。此时最好放弃非托管版本并仅处理托管对象。

我明白你为什么感到困惑。我希望这会有所帮助。

关于java - 如何持久保存引用的 RealmObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59693019/

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