2009-09-12 173 views
0

的關係我有一個是通過一個一對多的關係連接的兩個實體,讓我們說CategoryEntityItemEntity。該關係對於CategoryEntity(可以是沒有項目的類別)是可選的,但是對於每個ItemEntity都是必需的。在應用程序加載時,類別已經存在於商店中,我想導入ItemEntities並將它們連接到適當的CategoryEntity。設置與核心數據

顯然執行FetchRequest每個ItemEntity找到匹配的類別將不會是一個很好的解決方案,因爲會出現每次約4000-6000資料..

那麼,有沒有什麼更有效,我可以做?

+0

提取用於檢索托管對象(MO)。你能澄清你的問題嗎?你在問如何將一個CategoryEntity MO實例分配給一個ItemEntity MO實例嗎?還是你問如何獲取沒有CategoryEntity賦值的ItemEntity MO列表,併爲其分配特定的CategoryEntity MO? – 2009-09-12 10:53:55

+0

是的,我的問題恐怕不是很清楚。我在問如何將一個CategoryEntity MO實例分配給新創建的ItemEntity MO實例。每個ItemEntity MO應該被分配給適當的CategoryEntity MO。 我想我是通過使用字典來更快地引用類別,但任何更好的架構都是值得歡迎的。 – johnl 2009-09-12 16:24:55

回答

2

如果您已正確設置核心數據模型,那麼從類別實體到項目實體有一對多的關係,並且項目與類別之間存在一種相反的關係。另外,對於一對一關係您有一個「級聯」刪除規則,對於一對一關係有一個「無效」刪除規則。

假設這樣,每次插入Item對象時,設置其類別關係都會自動將Item插入到相應的Category中。刪除項目會自動將其從相應的類別中刪除。

在類別方面,刪除類別會自動刪除所有相應的Item對象。

因此,當您獲取Items時,您已經爲每個Item對象獲取其對應的Category對象。你不需要做任何事情。請注意,默認情況下,在提取期間實際上並未檢索到Category對象,而是在您第一次嘗試訪問對象並在此時檢索到對象時觸發錯誤。如果您不打算立即使用存儲在剛剛獲取的Item對象中的Category對象,這會提供更好的性能。如果您計劃使用類別對象幾乎每次取一個項目的時候,那麼你就必須使用NSFetchRequest方法

- (void)setReturnsObjectsAsFaults:(BOOL)yesNo 
- (void)setRelationshipKeyPathsForPrefetching:(NSArray *)keys 

告訴核心數據,你現在確實需要斷裂和你問的預取你的等級關係。

0

當你說'進口'項目實體,你是什麼意思?這些數據是否存儲在另一個Core Data存儲中,以另一種格式定義在某個文件中,通過網絡檢索?

一種方法是一次性獲取所有類別,並將它們添加到充當緩存的NSDictionary中,並通過某個標識值進行鍵控,以便您執行快速查找。對於您在導入期間實例化的每個項目實體(無論如何),檢索其類別ID,然後從緩存中檢索Category MO。設置關係,然後保存。更好的辦法是,批量增加一些插入操作,並且每10或100或1000存儲一次以減少IO開銷。