我是Core Data的新手。我注意到集合类型不可用作属性类型,并且想知道将数组/字典类型数据存储为属性的最有效方法是什么(例如构成街道,城市等地址的元素确实如此)不需要单独的实体,并且比单独的属性/字段更方便地存储为字典/数组。谢谢。
答案 0 :(得分:243)
Core Data中没有“本机”数组或字典类型。您可以将NSArray
或NSDictionary
存储为可转换属性。这将使用NSCoding
将数组或字典序列化为NSData
属性(并在访问时对其进行适当的反序列化)。这种方法的优点是它很容易。缺点是您无法查询数组或字典(它在数据存储中存储为BLOB),如果集合很大,您可能需要将大量数据移入/移出数据存储(如果是一个SQLite数据存储)只是为了读取或修改集合的一小部分。
另一种方法是使用Core Data to-many关系来建模数组或字典集合的语义。数组更容易,所以让我们开始吧。 Core Data to-many关系实际上是对一个集合进行建模,因此如果您需要类似于数组的功能,则必须对集合进行排序(使用fetched属性是一种方便的方法)或者为实体添加额外的index属性存储数组项并自己管理索引。如果要存储同类数组(所有条目都是相同类型),则可以轻松地为数组实体建模实体描述。如果没有,您将必须决定是否使用可转换属性来存储商品数据或创建商品系列实体。
对字典建模可能需要与存储密钥和值的一组实体建立多对多关系。键和值都类似于上面描述的数组的项实体。因此,它们可以是本机类型(如果您提前知道它们),可转换属性或与特定类型实体系列中的实例的关系。
如果这听起来有点令人生畏,那就是。将任意数据存储到像Core Data这样依赖于模式的框架中是很困难的。
对于结构化数据,例如地址,花费时间明确地对实体建模(例如,地址的每个部分的属性)几乎总是更容易。除了避免所有额外的代码来建模字典,这使得你的UI更容易(绑定将“正常工作”)和你的验证逻辑等更清晰,因为它可以由Core Data处理。
<强>更新强>
从OS X 10.7开始,Core Data包含一个有序集类型,可用于代替数组。如果您可以定位10.7或更高版本,这是有序(类似阵列)集合的最佳解决方案。
答案 1 :(得分: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];
所以这里的关键项目是: