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

我是核心数据的新手。我已经注意到集合类型不能作为属性类型使用,并且想知道将数组/字典类型数据作为属性存储的最有效方法是什么(例如,组成地址的元素,如 street、 city 等,不需要单独的实体,而且作为字典/数组存储比单独的属性/字段存储更方便)。谢谢你。

76270 次浏览

在核心数据中没有“本机”数组或字典类型。可以将 NSArrayNSDictionary存储为可转换属性。这将使用 NSCoding将数组或字典序列化为 NSData属性(并在访问时对其进行适当的反序列化)。这种方法的优点是很容易。缺点是无法查询数组或字典(它在数据存储中以 BLOB 的形式存储) ,如果集合很大,可能需要将大量数据从数据存储(如果是 SQLite 数据存储)移动到数据存储,只是为了读取或修改集合的一小部分。

另一种方法是使用 CoreDatato- many 关系对数组或字典集合的语义进行建模。数组更容易,所以让我们从它开始。Core Data to-many 关系实际上是对一个集合进行建模,所以如果你需要类似数组的功能,你必须对集合进行排序(使用提取的属性是一种方便的方法) ,或者向存储数组项并自己管理索引的实体添加额外的索引属性。如果存储的是同构数组(所有条目的类型都相同) ,则很容易为数组实体建模实体描述。如果没有,则必须决定是使用可转换属性来存储项数据,还是创建一系列项实体。

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

如果这一切听起来有点令人生畏,那就是真的。将任意数据强行塞入依赖于模式的框架(比如 CoreData)是很困难的。

对于结构化数据,比如地址,显式地对实体建模(例如,地址的每个部分的属性)几乎总是更容易。除了避免所有额外的代码建模一个字典,这使您的 UI 更容易(绑定将“只是工作”)和验证逻辑等更清楚,因为它的大部分可以由核心数据处理。

更新

从 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];

因此,这里的关键项目是:

  • 我对属性类型使用 NSSet
  • 我使用 NSTransformableAttributeType 作为核心数据管理对象模型中的属性类型。