objective-c - 最佳實踐?-數組/字典作為核心數據實體屬性




ios core-data nsarray nsdictionary (3)

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


Answers

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

我的實體看起來像這樣:

@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作為核心數據管理對像模型中的屬性類型。

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

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

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

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

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

更新

從OS X 10.7開始,Core Data包含一個可用於替代陣列的有序集合類型。 如果您的目標可以是10.7或更高版本,那麼這對於有序(類似數組)的集合來說是最好的解決方案。


斯威夫特:)

 var commaSeparatedString = arrayOfEntities.joinWithSeparator(",")




objective-c ios core-data nsarray nsdictionary