我有两个通过一对多关系连接的实体,假设 CategoryEntity 和 ItemEntity 。对于CategoryEntity,这种关系是可选的(可以有没有项目的类别),但每个ItemEntity都需要这种关系。在应用程序加载时,类别已存在于商店中,我想导入ItemEntities并将它们连接到相应的CategoryEntity。
显然,为每个ItemEntity执行FetchRequest以找到匹配的类别将不是一个好的解决方案,因为每次都会有大约4000-6000个项目..
那么,我能做些什么更有效的事情吗?
答案 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开销。