最佳实践?-数组/字典作为核心数据实体属性


175

我是Core Data的新手。我注意到集合类型不能用作属性类型,并且想知道最有效的方式是将数组/字典类型数据存储为属性(例如,组成街道,城市等地址的元素)不需要单独的实体,并且比单独的属性/字段更方便地存储为字典/数组。谢谢。


6
在地址中带有字符串字段的实体可能比在字典中更容易使用,在字典中,您必须记住自己的键……
Daniel

Answers:


246

核心数据中没有“本机”数组或字典类型。您可以将NSArrayNSDictionary作为可转换属性存储。这将用于将NSCoding数组或字典序列化为NSData属性(并在访问时适当地反序列化)。这种方法的优点是很容易。缺点是您无法查询数组或字典(它作为BLOB存储在数据存储区中),并且如果集合很大,则可能必须将大量数据移入/移出数据存储区(如果是SQLite数据存储区)只是为了读取或修改集合的一小部分。

另一种选择是使用“核心数据”对多关系来对数组或字典集合的语义建模。数组更容易,所以让我们开始吧。核心数据对很多关系实际上是在建模一个集合,因此,如果需要类似数组的功能,则必须对集合进行排序(使用fetched属性是一种简便的方法)或向实体添加额外的索引属性它存储数组项并自己管理索引。如果要存储同质数组(所有条目均为同一类型),则可以轻松地为数组实体的实体描述建模。如果不是,则必须决定是使用可转换属性存储项目数据还是创建项目实体系列。

对字典建模可能需要与存储键和值的一组实体建立一对多关系。键和值都类似于上述数组的项目实体。因此,它们可以是本机类型(如果您提前知道的话),可转换的属性或与特定于类型的实体系列中的实例的关系。

如果这听起来有些令人生畏,那就是。将任意数据导入像Core Data这样的依赖于架构的框架中很难。

对于诸如地址之类的结构化数据,花时间明确地对实体进行建模(例如,地址各部分的属性)几乎总是容易的。除了避免所有额外的代码来为字典建模之外,这还使您的UI更加容易(绑定将“正常工作”),并且使验证逻辑等更加清晰,因为其中很多可以由Core Data处理。

更新资料

从OS X 10.7开始,Core Data包含有序集合类型,可以代替数组使用。如果您可以定位10.7或更高版本,则这是有序(类似数组)集合的最佳解决方案。


借调-确认我已经想到的内容,但对可转换属性一无所知。
jkp 2010年

3
变形的@pixelfreak使用取决于如何,你需要在集合中使用的项目。如果您需要对它们进行查询,或者希望能够延迟加载其中的一些或全部,则可转换属性将不起作用。如果您不需要延迟加载,不需要查询并且始终需要所有项或根本不需要所有项,那么可转换属性可能对您有用(并且很容易实现)。
巴里·沃克

3
《核心数据编程指南》的“ 非标准持久性属性 ”一章中更详细地描述了Barry所说的内容。
Palimondo'9

2
关于有序集的注意事项:不要将它们用于在许多方面具有超过数千个对象的多对多关系。如果这样做,保存可能开始花费很长时间,以至于阻塞了线程。
Kirk van Gorkom

2
我不了解“新订购的套”。是属性吗?因为我在属性类型菜单中看不到它。
绘制

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作为属性类型。

那么,您是否会将此代码放在init方法中的AppointmentSearchResponse.m中?
Chicowitz 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.