Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/180.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何持久化引用的RealmObjects_Java_Android_Realm_Persistence - Fatal编程技术网

Java 如何持久化引用的RealmObjects

Java 如何持久化引用的RealmObjects,java,android,realm,persistence,Java,Android,Realm,Persistence,考虑以下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

考虑以下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
中,我将修改后的
Visit
实例复制到Realm。我的问题是,这样做还会保留新创建的时间段对象吗


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

如果您知道在哪里查找,您的大多数问题都会在Realm文档中得到回答。这些问题在主文档中有很多提示,然后您需要找到正确的API页面。有时候,我会尝试一下

您会注意到,在addTimeSlot中,我将修改后的访问实例复制到Realm。我的问题是,这样做还会保留新创建的时间段对象吗

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

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

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

因此,最好是:-

  • 创建域时,将
    访问添加到域中
  • addTimeSlot
    中,使用
    getRealm()
    的结果验证是否管理了
    Visit
    。如果是,请将
    时隙添加到Realm和RealmList中
  • 我对你的
    时隙
    主键的工作原理很感兴趣

    不管怎样,回到你的问题上来

    当我从域中检索myVisit时,是否可以保证myVisit.TimeSlot中的时间段对象的顺序与我添加它们时的顺序相同

    对。已订购
    RealmList
    。您可以在末尾添加元素,也可以使用
    RealmList
    插入元素。如果没有存储订单,这显然是多余的。看

    文档提到非托管对象类似于简单的POJO。据我所知,如果我创建一个RealObject子类实例,并且从不将其复制到一个领域,它将保持“非托管”

    但是,如果我将它添加到作为“托管”RealmObject一部分的RealmList实例,会发生什么呢

    对此进行了讨论。然后,您的列表就是托管域列表,下面的语句适用:

    可以将非托管对象添加到已托管的RealmList。在这种情况下,如果对象具有主键,则将使用Realm.copyToRealm(RealmModel,ImportFlag…)或Realm.copyToRealmOrUpdate(RealmModel,ImportFlag…)将对象透明地复制到Realm

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


    我明白你为什么困惑了。我希望这能有所帮助。

    您有错误吗?我没有错误。这只是我在Realm的第三天,从文档中我不清楚这些包含对象的持久性是自动的还是必须独立完成。有人谈论托管对象和非托管对象,但这并没有使事情变得更清楚。文档提到非托管对象类似于简单的POJO。据我所知,如果我创建一个RealObject子类实例,并且从不将其复制到一个领域,它将保持“非托管”。但是,如果我将它添加到作为“托管”RealmObject一部分的RealmList实例,会发生什么呢?不清楚…我的建议是:尝试持久化,然后尝试读取并验证是否创建了嵌套对象。谢谢。一个非常全面的答案。是的,Realm确实不错,但是文档并不总是对初学者友好的。
    myVisit.addTimeSlot(new TimeSlot(30));