使用 NSFetchedResultsControllers 遍历一对多关系

Posted

技术标签:

【中文标题】使用 NSFetchedResultsControllers 遍历一对多关系【英文标题】:Traversing one-to-many relationships with NSFetchedResultsControllers 【发布时间】:2011-06-07 15:22:58 【问题描述】:

我正在创建一个可以在多个级别的一对多关系中导航的应用。例如,假设CoreDataBooks 代码示例以流派列表开头,您单击一个流派并然后获取按作者组织的书籍列表,如 Apple 的代码示例所示。 p>

这是我的问题:Apple 文档告诉我应该使用 FetchedResultsController 来帮助将我的书籍列表组织成多个部分(以及其他原因)。但是当试图弄清楚如何从“一种”类型到我的“许多”书籍时,Core Data FAQ 告诉不要使用提取。来自常见问题解答:

我有一个从实体 A 到实体 B 的一对多关系。如何获取与实体 A 的给定实例相关的实体 B 的实例?

你没有。更具体地说,不需要显式获取目标实例,您只需在实体 A 的实例上调用适当的键值编码或访问器方法。

当然,问题是我现在有我的书,但我希望它们从获取的结果控制器中获取。

在这里进行的最佳方式是什么?我应该遵循常见问题解答吗?如果是,我如何按作者将我的书分成几部分?

或者我是否使用获取的结果控制器(我怀疑它更好),在这种情况下我如何遍历一对多关系(因为 Apple 非常有用的答案只是“不要”) ?

非常感谢您的帮助。

萨沙

【问题讨论】:

【参考方案1】:

您的数据模型大致如下所示:

Genre
  name:
  books<-->>Book.genre


Book
  name:
  genre<<-->Genre.books

在您的主表中,您运行一个抓取结果控制器来获取Genre 对象的表。然后用户选择在幕后选择特定Genre 对象的行之一。

由于每个Genre 对象都有一个指向相关Book 对象的books 关系,因此您会自动获得对所有相关图书对象的引用,因此您无需获取任何内容。对于您的书表视图,您只需在选定的Genre 对象的books 关系中创建Book 对象的排序数组。

将 Core Data 对象图想象成一团串珠串,所有这些串珠在网或织物中编织在一起。珠子是对象,弦是关系。一次抓取会从团块中取出一个珠子/物体,但是一旦你拿到了那个珠子/物体,你就可以拉动它的绳子/关系来拉出与你手中的珠子相关的所有珠子/物体。

因此,在大多数情况下,提取只是用于查找起始对象,然后您遍历关系以查找大多数其他对象。

这就是为什么 Apple 文档说您不需要第二次提取。

【讨论】:

以上是关于使用 NSFetchedResultsControllers 遍历一对多关系的主要内容,如果未能解决你的问题,请参考以下文章

核心数据保存竞争条件错误

在 Swift 3 中难以配置 NSFetchedResultsController

为啥 beginUpdates/endUpdates 会重置表视图位置以及如何阻止它这样做?

测试使用

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?