遵循官方文件指南:Realm Relationships
我试着写一些多对一关系的代码,我发现了一些不一致的东西。
两个POJO Contace.java
和Email.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
对象将成为两个不同的对象?我认为这不再是一对多的关系,它只是一对一的关系。
情况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();
在这里,我们只能在表格中看到一个电子邮件对象,这正是我所期望的,正如上面的文档所述。
那么,为什么情境1 和情境2 没有一致性?这是 situation1 中的错误吗?或者我错过了什么?
Realm version(s):0.88.3
Android Studio版本:2.0
期待您的回复!谢谢!
答案 0 :(得分:1)
感谢beeender的回答:[issue-2730]
这是预期的行为。
在情境1 中,您设置为contactA和contactB的电子邮件是一个不受Realm管理的独立对象。因此,当您将其复制到Realm时,Realm无法知道您的意思是它们是同一个对象。要解决此问题,您可以将@PrimaryKey添加到电子邮件中,然后使用copyToRealmOrUpdate。 Realm将尝试根据主键检测您是否表示contactA和contactB的相同电子邮件对象。
在情境2 中,由于电子邮件对象由Realm管理,因此当您调用setter时,Realm知道该电子邮件实际上是同一个。
最后,我在@PrimaryKey
和Contact
中设置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 中,Contact
和Email
之间的关系正确无误。
答案 1 :(得分:0)
在第一种情况下,会创建两封电子邮件,因为您在不同的实例上执行了两次copyToRealm
。
来自文档每个联系人(联系人的实例)都有0或1封电子邮件(电子邮件的实例)