我是新来的核心数据。 我注意到,集合类型不能作为属性类型,并想知道最有效的方式是存储阵列/字典类型的数据作为一个属性(例如,使像街道,城市等做一个地址的元素是什么不需要单独的实体,更方便地存储为字典/阵列不是单独的属性/字段)。 谢谢。
Answer 1:
有在核心数据没有“天然的”数组或字典类型。 您可以存储NSArray
或NSDictionary
的变形特性。 这将使用NSCoding
到阵列或字典序列化为NSData
属性(并适当地反序列化时访问)。 这种方法的优点是,它很容易。 缺点是无法查询到数组或字典(它存储在数据存储中的BLOB),如果集合很大,您可能需要大量的数据从数据存储移动到/(如果它是一个SQLite数据存储)只读取或修改该集合的一小部分。
另一种方法是使用核心数据对多关系到数组或字典集合的语义建模。 数组是比较容易,所以让我们开始这一点。 核心数据对多关系是真正建模一套,所以如果你需要数组一样的功能,你必须要么排序集(使用已取得的财产是一种方便的方式来做到这一点),或添加额外的索引属性的实体存储阵列项目,并管理自己的索引。 如果要存储一个均匀的阵列(所有条目都是同一类型),可以很容易地将实体模型描述为数组实体。 如果没有,你就必须决定是否使用变形属性来存储项目数据,或创建一个家庭项目实体。
建模字典很可能需要一个一对多的关系,一个实体的集合存储键和值。 两个键和值是类似于项目实体为阵列,如上所述。 因此,他们既可以是原生类型(如果你提前知道它们),可变形的属性或从家庭类型特定实体的一个实例的关系。
如果这一切听起来有点吓人,它是。 Shoehorning任意数据到像核心数据架构相关的框架是很难的。
对于结构化数据,如地址,它几乎总是容易花时间明确建模实体(例如,对于地址的每个部分的属性)。 除了避免所有额外的代码模型的字典,这使你更容易的用户界面(绑定将“只是工作”)和您的验证逻辑等更清楚,因为很多是可以通过核心数据处理。
更新
作为OS X 10.7的,核心数据包括一组有序的类型,其可代替的阵列的使用。 如果你能目标10.7或更高版本,这是有序的(阵列等)收集的最佳解决方案。
Answer 2:
我有一个类似的问题。 就我而言,我想映射字符串数组。 我跟着巴里的建议终于得到它的工作。 下面是一些代码的样子(这将有望澄清事情其他人谁运行到这一点)...
我的实体看起来是这样的:
@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作为核心数据管理对象模型的属性类型。