2016-11-16 48 views
0

我試圖在嵌套對象中做一些簡單的更新,我注意到它沒有一致地發生。無法一致更新Realm中的嵌套對象

讓我們假設假設以下類別涉及:

@interface Dog : RLMObject 
@property NSString *name; 
@property NSData *picture; 
@property NSInteger age; 
@end 

@interface Person : RLMObject 
@property NSString    *name; 
@property RLMArray<Dog *><Dog> *dogs; 
@end 

如果服務器通過我一個Person對象有一個更新的狗的名字,現在我只想做(在僞代碼)

for (Dog *dog in person.dogs) 
{ 
    dog.name = updatedDogName; 
} 

[defaultRealm beginWriteTransaction]; 
[defaultRealm addOrUpdateObject:person]; 
[defaultRealm commitWriteTransaction]; 

假設:
1)Person和相應的Dog對象具有唯一的主鍵
2)Person和相應的Dog對象已經存在於DB中,並且我只是通過Person對象更新Dog對象。

我在這裏做錯了什麼?我注意到更新大概只有一半時間發生。

+0

賈斯珀你好。有什麼方法可以創建示範項目來演示此行爲並將其發送至[email protected]?能夠重現問題將幫助我們弄清楚發生了什麼。 – AustinZ

+0

就像觀察一樣,如果你在這個事務中只改變了狗的名字,就沒有必要調用'[defaultRealm addOrUpdateObject:person];'。在這種情況下,由於你的'Person'沒有主鍵,這將保證每次調用它時都會向數據庫添加一個新的'Person'副本。 – TiM

+0

@AustinZ,我認爲這個問題源於使用writeCopyToURL在寫事務進行時壓縮數據庫的大小。我目前正在努力追蹤我需要在autoreleasepools中添加哪些內容以減少這種情況的發生。如果有任何寫入事務正在進行,或者在內存中是否有任何連接到默認領域的實例的領域對象,是否有智能的方法? –

回答

0

問題源自調用writeCopyToURL,而附加了Realm實例的對象正在使用中(例如person.realm != nil)。更自由地使用autoreleasepools來減少發生這種事情的可能性。