2011-03-18 52 views
0

我們有一個需要更新現有核心數據存儲以添加子關係的過程。我們已經有一個叫做人類的實體,但現在我們增加了將人類作爲其他人類的父母的能力。到目前爲止,我們這樣做的方式是首先獲取將作爲父對象的人,然後獲取將成爲子對象的人,然後將這些子對象添加到父對象上名爲「children」的NSSet *屬性。然而,這需要從核心數據中獲取兒童和父母,這很慢,尤其是考慮到我們可能有數以萬計的對象。創建沒有獲取現有對象的核心數據關係

父/子關係是一項新功能,我們從服務器的xml流獲取關係數據。它基本上包含我們每個人的整數ID和他們孩子的人的整數列表。

有沒有辦法建立這種關係,而不是取孩子呢?你能創建一個像這樣的關係,只需使用NSManagedObjectID或其他標識符?或者你是否必須從核心數據中獲取整個對象?我們可以肯定的一件事是,所有人類對象都保證在覈心數據中,因此永遠不需要創建新的人類對象,它們都已經在覈心數據存儲中。

回答

0

如果您具有對象的實際managedObjectID,則可以使用-[NSMangedObjectContext objectForID:]從數據庫中僅獲取該特定對象。這將比獲取每個對象更快。

但是,沒有兩個對象都沒有辦法設置關係。

0

「獲取的屬性」旨在幫助解決這樣的問題,它允許您訪問相關對象,就好像它是直接關係一樣,但是直到請求時纔會執行提取。他們只是單向關係。

請參見:Fetched Properties v Relationships (Core Data - iPhone)

+0

如果速度是他的擔心,那麼獲取的屬性將無濟於事。在每個對象中獲取關係需要更長的時間,而不是將它們設置爲關係。 – TechZen 2011-03-19 20:58:14

0

沒有辦法設置的一對多關係的價值,而不會引起故障。調用對象級別設置器(例如addParent:(Human *)parent)或直接操作該組件將觸發故障。 CoreData必須這樣做才能確保關係完整性。

[NSManagedObjectContext objectForID:]會向您返回一個錯誤,然後您可以使用它作爲對象傳遞給關係,但只要您設置關係的一側,對象就會出錯。

我不確定你使用了多少數據,但是如果你的實體足夠輕,理論上可以將它們全部存入內存,並在那裏進行排序/搜索(NSArray + NSPredicate)。

相關問題