与Core Data建立关系

时间:2009-09-12 09:10:47

标签: iphone cocoa-touch core-data entity-relationship

我有两个通过一对多关系连接的实体,假设 CategoryEntity ItemEntity 。对于CategoryEntity,这种关系是可选的(可以有没有项目的类别),但每个ItemEntity都需要这种关系。在应用程序加载时,类别已存在于商店中,我想导入ItemEntities并将它们连接到相应的CategoryEntity。

显然,为每个ItemEntity执行FetchRequest以找到匹配的类别将不是一个好的解决方案,因为每次都会有大约4000-6000个项目..

那么,我能做些什么更有效的事情吗?

2 个答案:

答案 0 :(得分:2)

如果您已正确设置Core Data模型,那么您具有从Category实体到Item实体的多对多关系,以及从Item到Category的反向关系。此外,对于多对多关系,您有一个“级联”删除规则,对于一对一关系,您有一个“无效”删除规则。

假设这样,每次插入Item对象时,设置其Category关系会自动将Item插入相应的Category。删除项目会自动将其从相应的类别中删除。

在类别方面,删除类别会自动删除所有相应的Item对象。

因此,当您获取Items时,您已经为每个Item对象提取了相应的Category对象。你不需要做任何其他事情。请注意,默认情况下,您在获取期间实际上并未检索Category对象:而是在您第一次尝试访问对象时触发故障,并在此时检索对象。如果您不打算立即使用刚刚获取的Item对象中存储的Category对象,则可以提供更好的性能。如果您计划在每次获取Item时使用Category对象,则必须使用NSFetchRequest方法

- (void)setReturnsObjectsAsFaults:(BOOL)yesNo
- (void)setRelationshipKeyPathsForPrefetching:(NSArray *)keys

告诉Core Data你现在想要了解错误,并要求预取你的类别关系。

答案 1 :(得分:0)

当你说'导入'项目实体时,你的意思是什么?这些是在另一个核心数据存储中,在某个文件中以另一种格式定义,通过网络检索吗?

一种方法是一次性获取所有类别,并将它们添加到充当缓存的NSDictionary中,并通过允许您执行快速查找的某个标识值进行键控。对于在导入期间实例化的每个项目实体(无论这意味着什么),检索其类别ID,然后从缓存中检索类别MO。设置关系然后保存。更好的是,批量插入多个插入并保存每10,100或1000以减少IO开销。