2009-10-13 110 views
169

我是核心數據的新手。我注意到集合類型不可用作屬性類型,並且想知道將數組/字典類型數據存儲爲屬性的最有效方式是什麼(例如,構成像街道,城市等地址的元素的作用不需要單獨的實體,並且比單獨的屬性/字段更方便地存儲爲字典/數組)。謝謝。最佳實踐? - 數組/字典作爲核心數據實體屬性

+5

使用字符串字段作爲地址的實體可能比字典必須記住您的密鑰更容易使用... – Daniel 2009-10-13 20:29:04

回答

238

有一個在覈心數據沒有「天然的」數組或字典類型。您可以將NSArrayNSDictionary作爲可變形屬性進行存儲。這將使用NSCoding將數組或字典序列化爲NSData屬性(並在訪問時對其進行適當的反序列化)。這種方法的優點是很容易。缺點是你無法查詢數組或字典(它作爲BLOB存儲在數據存儲中),並且如果集合很大,則可能需要將大量數據移入/移出數據存儲(如果它是一個SQLite數據存儲)只是爲了讀取或修改一小部分集合。

的替代方法是使用核心數據對多關係到陣列或字典集合的語義建模。數組更容易,所以讓我們從頭開始。核心數據一對多關係實際上是對一個集合建模的,所以如果您需要類似數組的功能,則必須對集合進行排序(使用提取屬性是實現此目的的便捷方式),或者爲實體添加額外的索引屬性它存儲數組項並自己管理索引。如果您正在存儲一個同類數組(所有條目都是相同類型),則很容易爲數組實體的實體描述建模。如果不是,則必須決定是否使用可變形屬性來存儲項目數據或創建項目實體系列。

建模字典很可能需要一個一對多的關係,一個實體的集合存儲鍵和值。如上所述,鍵和值都類似於數組的項目實體。因此,它們可以是本機類型(如果您事先知道它們),可轉換的屬性或與來自特定於類型的實體系列的實例的關係。

如果這一切聽起來有點嚇人,它是。將任意數據轉化爲像Core Data這樣的依賴於模式的框架非常困難。

對於結構化數據,如地址,它幾乎總是容易花時間明確建模實體(例如地址的每個部分的屬性)。除了避免所有額外的代碼來模擬字典,這使得您的用戶界面更容易(綁定將「只是工作」)和您的驗證邏輯等更清晰,因爲它的大部分可以由Core Data處理。

更新

作爲OS X 10.7的,核心數據包括可以在適當位置的陣列一起使用的有序集類型。如果您的目標可以是10.7或更高版本,那麼這對於有序(類似數組)的集合來說是最好的解決方案。

+0

借調 - 證實了我已經想到但我不知道可變形屬性。 – jkp 2010-06-02 10:15:55

+0

@Barry所以我很好奇,什麼時候才能使用可變形的「正確」時間?說如果我的實體有一個字符串數組,該數組不超過100個項目,並且該字符串是一個普通的英語單詞,那麼使用可轉換性會好嗎? – pixelfreak 2011-07-21 04:06:21

+3

@pixelfreak可變形的使用取決於*你需要如何使用集合中的項目。如果您需要針對它們進行查詢,或者您希望能夠延遲加載其中的一部分或全部,則可轉換屬性將不起作用。如果你不需要延遲加載,不需要查詢並且總是需要所有的項目或者不需要,可變形的屬性可能適合你(並且當然很容易實現)。 – 2011-08-18 12:14:46

11

我有一個類似的問題。在我的情況下,我想映射一個字符串數組。我遵循了巴里的建議,最終讓它工作。下面是一些代碼的樣子(這將有助於澄清其他任何人遇到的情況)...

我的實體看起來是這樣的:

@interface AppointmentSearchResponse : NSManagedObject 
@property (nonatomic, retain) NSSet *messages; 
@end 

我的管理對象模型代碼(核心數據)的代碼看起來是這樣的:

NSEntityDescription *entityDescription = [[NSEntityDescription alloc] init]; 
[entityDescription setName:@"AppointmentSearchResponse"]; 
[entityDescription setManagedObjectClassName:@"AppointmentSearchResponse"]; 

NSMutableArray *appointmentSearchResponseProperties = [NSMutableArray array]; 
NSAttributeDescription *messageType = [[NSAttributeDescription alloc] init];  
[messageType setName:@"messages"]; 
[messageType setAttributeType:NSTransformableAttributeType]; 
[appointmentSearchResponseProperties addObject:messageType]; 

[entityDescription setProperties:appointmentSearchResponseProperties]; 

所以這裏的重點項目有:

  • 我正在使用屬性類型的NSSet
  • 我使用NSTransformableAttributeType作爲核心數據管理對象模型中的屬性類型。
+0

那麼你會把這段代碼放在AppointmentSearchResponse.m中的init方法中嗎? – Chicowitz 2015-09-05 21:34:35