2016-04-28 81 views
2

繼官方文件指南: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("[email protected]"); 
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("[email protected]"); 
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 在這裏我們可以看到在表中只有一個Email對象,這就是我所期待的,正如上面的文檔中描述。

那麼,爲什麼情況1情況2沒有一致性?這是否是情況1中的錯誤?或者我錯過了什麼?

境界版(S):0.88.3

的Android Studio版本:2.0

期待您的回覆!謝謝!

回答

0

感謝beeender的答案在這裏:[issue-2730]

這是預期行爲。

情況1中,您設置爲contactA和contactB的電子郵件是獨立對象,它不受Realm管理。所以當你將它複製到Realm時,Realm無法知道你的意思是它們是同一個對象。爲了解決這個問題,你可以添加@PrimaryKey到電子郵件,然後使用copyToRealmOrUpdate。 Realm會根據主鍵嘗試檢測是否同時指定了contactA和contactB的同一個電子郵件對象。

situation2,因爲郵件對象由域管理,當你調用制定者,境界知道,電子郵件實際上是同一個。

最後,我設置了@PrimaryKey無論是在ContactEmail,如下:

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 
} 

然後換copyToRealm()copyToRealmOrUpdate()上contactA和contactB。

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

而且關係中間人ContactEmail是正確情況1

0

在第一種情況下會創建兩個電子郵件,因爲您在不同的實例上執行了兩次copyToRealm

從文檔每個聯繫人(聯繫人實例)有0或1的郵箱(email的實例)

+0

copyToRealm()調用聯繫人對象,聯繫人應創建2次,但我不認爲電子郵件應該創建2次,因爲它是多對一關係,而不是一對一關係,情境2是什麼我期望。或者你能解釋情況1的原則嗎?謝謝。 – codezjx

+1

也許你應該嘗試使用copyToRealmOrUpdate()而不是copyToRealm() –