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

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

核心数据中没有“本地”数组或字典types。 您可以将NSArrayNSDictionary存储为可转换属性。 这将使用NSCoding将数组或字典序列化为NSData属性(并在访问时正确地将其反序列化)。 这种方法的优点是很容易。 缺点是你不能查询到数组或字典(它存储为数据存储区中的BLOB),如果集合很大,则可能需要将大量数据移入/移出数据存储区(如果是一个SQLite数据存储)只是为了读取或修改一小部分集合。

另一种方法是使用核心数据对多关系来模拟数组或字典集合的语义。 数组更容易,所以让我们从这个开始。 核心数据一对多关系实际上是对一个集合build模的,所以如果你需要类似数组的function,你必须对集合进行sorting(使用提取的属性是一个方便的方法)或者为实体添加一个额外的索引属性它存储数组项并自己pipe理索引。 如果要存储一个同类数组(所有条目都是相同的types),则可以很容易地为数组实体build模实体描述。 如果不是,则必须决定是否使用可变形属性来存储项目数据或创build项目实体系列。

对字典进行build模可能需要与存储密钥和值的一组实体进行多对多关系。 如上所述,键和值都类似于数组的项目实体。 所以它们既可以是本地types(如果你知道它们),也可以是一个可转换的属性,或者是一个types特定实体家族中的一个实例的关系。

如果这一切听起来有点令人生畏,那就是。 将任意数据转化为像Core Data这样的依赖于模式的框架是非常困难的。

对于结构化的数据,比如地址,花在显式build模实体上的时间总是比较容易的(例如地址每个部分的属性)。 除了避免所有额外的代码build模字典,这使得您的用户界面更容易(绑定将“只是工作”)和您的validation逻辑等更清晰,因为它的大部分可以由核心数据处理。

更新

从OS X 10.7开始,Core Data包含一个有序集合types,可用于替代arrays。 如果您的目标是10.7或更高版本,那么对于有序(类似数组)的集合,这是最好的解决scheme。

我有一个类似的问题。 在我的情况下,我想映射一个string数组。 我跟着巴里的build议,终于搞定了。 这是一些代码的样子(这将有希望澄清事情的其他人遇到这个)…

我的实体看起来像这样:

 @interface AppointmentSearchResponse : NSManagedObject @property (nonatomic, retain) NSSet *messages; @end 

我的pipe理对象模型代码(核心数据)代码如下所示:

 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作为属性types
  • 我正在使用NSTransformableAttributeType作为核心数据pipe理对象模型中的属性types。