2009-09-12 113 views
0

的关系我有一个是通过一个一对多的关系连接的两个实体,让我们说CategoryEntityItemEntity。该关系对于CategoryEntity(可以是没有项目的类别)是可选的,但是对于每个ItemEntity都是必需的。在应用程序加载时,类别已经存在于商店中,我想导入ItemEntities并将它们连接到适当的CategoryEntity。设置与核心数据

显然执行FetchRequest每个ItemEntity找到匹配的类别将不会是一个很好的解决方案,因为会出现每次约4000-6000资料..

那么,有没有什么更有效,我可以做?

+0

提取用于检索托管对象(MO)。你能澄清你的问题吗?你在问如何将一个CategoryEntity MO实例分配给一个ItemEntity MO实例吗?还是你问如何获取没有CategoryEntity赋值的ItemEntity MO列表,并为其分配特定的CategoryEntity MO? – 2009-09-12 10:53:55

+0

是的,我的问题恐怕不是很清楚。我在问如何将一个CategoryEntity MO实例分配给新创建的ItemEntity MO实例。每个ItemEntity MO应该被分配给适当的CategoryEntity MO。 我想我是通过使用字典来更快地引用类别,但任何更好的架构都是值得欢迎的。 – johnl 2009-09-12 16:24:55

回答

2

如果您已正确设置核心数据模型,那么从类别实体到项目实体有一对多的关系,并且项目与类别之间存在一种相反的关系。另外,对于一对一关系您有一个“级联”删除规则,对于一对一关系有一个“无效”删除规则。

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

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

因此,当您获取Items时,您已经为每个Item对象获取其对应的Category对象。你不需要做任何事情。请注意,默认情况下,在提取期间实际上并未检索到Category对象,而是在您第一次尝试访问对象并在此时检索到对象时触发错误。如果您不打算立即使用存储在刚刚获取的Item对象中的Category对象,这会提供更好的性能。如果您计划使用类别对象几乎每次取一个项目的时候,那么你就必须使用NSFetchRequest方法

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

告诉核心数据,你现在确实需要断裂和你问的预取你的等级关系。

0

当你说'进口'项目实体,你是什么意思?这些数据是否存储在另一个Core Data存储中,以另一种格式定义在某个文件中,通过网络检索?

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