0

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

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

那么,有什么更有效的方法可以做吗?

4

2 回答 2

2

如果您正确设置了核心数据模型,那么您将拥有从 Category 实体到 Item 实体的一对多关系,以及从 Item 到 Category 的逆一对一关系。此外,您有一个用于一对多关系的“级联”删除规则和一个用于一对一关系的“无效”删除规则。

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

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

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

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

告诉 Core Data 你现在确实需要错误并且你要求预取你的 Category 关系。

于 2009-09-12T11:29:52.313 回答
0

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

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

于 2011-10-02T13:52:38.767 回答