使用 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