2009-10-13 37 views
169

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

+5

使用字符串字段作为地址的实体可能比字典必须记住您的密钥更容易使用... – Daniel 2009-10-13 20:29:04

回答

238

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

的替代方法是使用核心数据对多关系到阵列或字典集合的语义建模。数组更容易,所以让我们从头开始。核心数据一对多关系实际上是对一个集合建模的,所以如果您需要类似数组的功能,则必须对集合进行排序(使用提取属性是实现此目的的便捷方式),或者为实体添加额外的索引属性它存储数组项并自己管理索引。如果您正在存储一个同类数组(所有条目都是相同类型),则很容易为数组实体的实体描述建模。如果不是,则必须决定是否使用可变形属性来存储项目数据或创建项目实体系列。

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

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

对于结构化数据,如地址,它几乎总是容易花时间明确建模实体(例如地址的每个部分的属性)。除了避免所有额外的代码来模拟字典,这使得您的用户界面更容易(绑定将“只是工作”)和您的验证逻辑等更清晰,因为它的大部分可以由Core Data处理。

更新

作为OS X 10.7的,核心数据包括可以在适当位置的阵列一起使用的有序集类型。如果您的目标可以是10.7或更高版本,那么这对于有序(类似数组)的集合来说是最好的解决方案。

+0

借调 - 证实了我已经想到但我不知道可变形属性。 – jkp 2010-06-02 10:15:55

+0

@Barry所以我很好奇,什么时候才能使用可变形的“正确”时间?说如果我的实体有一个字符串数组,该数组不超过100个项目,并且该字符串是一个普通的英语单词,那么使用可转换性会好吗? – pixelfreak 2011-07-21 04:06:21

+3

@pixelfreak可变形的使用取决于*你需要如何使用集合中的项目。如果您需要针对它们进行查询,或者您希望能够延迟加载其中的一部分或全部,则可转换属性将不起作用。如果你不需要延迟加载,不需要查询并且总是需要所有的项目或者不需要,可变形的属性可能适合你(并且当然很容易实现)。 – 2011-08-18 12:14:46

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作为核心数据管理对象模型中的属性类型。
+0

那么你会把这段代码放在AppointmentSearchResponse.m中的init方法中吗? – Chicowitz 2015-09-05 21:34:35