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