领域关系中的问题:多对一,它创建重复的对象

时间:2016-04-28 13:03:58

标签: android realm

遵循官方文件指南:Realm Relationships

我试着写一些多对一关系的代码,我发现了一些不一致的东西。

两个POJO Contace.javaEmail.java定义如下:

public class Email extends RealmObject {
    private String address;
    private boolean active;
    // ... setters and getters left out
}

public class Contact extends RealmObject {
    private String name;
    private Email email;
    // ... setters and getters left out
}

情况1:创建一个普通的Email对象并分配给不同的Contact contactA和contactB。

Email email = new Email();
email.setAddress("realm_test@gmail.com");
email.setActive(true);

Contact contactA = new Contact();
contactA.setName("Bear");
contactA.setEmail(email);

Contact contactB = new Contact();
contactB.setName("Monkey");
contactB.setEmail(email);

realm.beginTransaction();
realm.copyToRealm(contactA);
realm.copyToRealm(contactB);
realm.commitTransaction();

我致电realm.copyToRealm()后,将在此处创建两个Email个对象。那么,当我从Realm查询Contact时,一个Email对象将成为两个不同的对象?我认为这不再是一对多的关系,它只是一对一的关系。 enter image description here

情况2:调用realm.createObject()创建代理Email对象和两个代理Contact对象,并将电子邮件分配给contactA和contactB。

realm.beginTransaction();
Email email = realm.createObject(Email.class);
email.setAddress("realm_test@gmail.com");
email.setActive(true);

Contact contactA = realm.createObject(Contact.class);
contactA.setName("Bear");
contactA.setEmail(email);

Contact contactB = realm.createObject(Contact.class);
contactB.setName("Monkey");
contactB.setEmail(email);
realm.commitTransaction();

enter image description here 在这里,我们只能在表格中看到一个电子邮件对象,这正是我所期望的,正如上面的文档所述。

那么,为什么情境1 情境2 没有一致性?这是 situation1 中的错误吗?或者我错过了什么?

Realm version(s):0.88.3

Android Studio版本:2.0

期待您的回复!谢谢!

2 个答案:

答案 0 :(得分:1)

感谢beeender的回答:[issue-2730]

  

这是预期的行为。

     

情境1 中,您设置为contactA和contactB的电子邮件是一个不受Realm管理的独立对象。因此,当您将其复制到Realm时,Realm无法知道您的意思是它们是同一个对象。要解决此问题,您可以将@PrimaryKey添加到电子邮件中,然后使用copyToRealmOrUpdate。 Realm将尝试根据主键检测您是否表示contactA和contactB的相同电子邮件对象。

     

情境2 中,由于电子邮件对象由Realm管理,因此当您调用setter时,Realm知道该电子邮件实际上是同一个。

最后,我在@PrimaryKeyContact中设置Email,如下所示:

public class Email extends RealmObject {
    @PrimaryKey
    private String address;
    private boolean active;
    // ... setters and getters left out
}

public class Contact extends RealmObject {
    @PrimaryKey
    private String name;
    private Email email;
    // ... setters and getters left out
}

然后在contactA和contactB上将copyToRealm()更改为copyToRealmOrUpdate()

realm.beginTransaction();
realm.copyToRealmOrUpdate(contactA);
realm.copyToRealmOrUpdate(contactB);
realm.commitTransaction();

在{strong>情境1 中,ContactEmail之间的关系正确无误。

答案 1 :(得分:0)

在第一种情况下,会创建两封电子邮件,因为您在不同的实例上执行了两次copyToRealm

来自文档每个联系人(联系人的实例)都有0或1封电子邮件(电子邮件的实例)