【问题标题】:sectionNameKeyPath through multiple relationshipssectionNameKeyPath 通过多个关系
【发布时间】:2026-02-10 18:00:01
【问题描述】:

我正在开发一个使用 Core Data 和 NSFetchedResultsController 的应用程序。模型设置如下:

/-----------\          /-----------\          /-----------\
|Part       |          |Kit        |          |Source     |
|-----------|          |-----------|          |-----------|
|name       |          |name       |          |name       |
|dimensions |          |description|          |location   |
|...        |          |...        |          |...        |
|-----------|          |-----------|          |-----------|
|kits       | <<-\     |source     | <<-----1 |kits       |
|           |     \->> |parts      |          |           |
\-----------/          \-----------/          \-----------/

因此,PartKit 具有多对任意关系(一个部件可以在一个或多个套件中,一个套件可以包含一个或多个部件)。每个Kit 来自一个Source,它可能提供一个或多个Kits。

我目前正在创建一个UITableView,它使用一个NSFetchedResultsController,其中包含所有Part 对象的简单列表。我想将这些部分分组,每个部分都是Source 的名称。即:

|-------------------------------|
|Source One                     |
|-------------------------------|
|Part One                       |
|Part Two                       |
|Part Three                     |
|-------------------------------|
|Source Two                     |
|-------------------------------|
|Part Four                      |
|Part Two                       |
|Part Five                      |
|....                           |
|-------------------------------|
|             O                 |
|-------------------------------|

由于Part 可能来自多个Sources,是否可以通过使用sectionNameKeyPath 使用NSFetchedResultsController 来执行此操作,还是我必须以完全不同的方式执行此操作?

谢谢!

【问题讨论】:

    标签: iphone cocoa-touch core-data ios nsfetchedresultscontroller


    【解决方案1】:

    我不这么认为,因为NSFetchedResultsController 不知道使用哪个KitParts 进行排序,因为这是多对多的关系。

    考虑一个树形视图,甚至是 Objective-C 继承结构,其中每个子节点只有一个父节点,但它本身可以有多个子节点。您可以轻松地将树从子节点递归到其父节点。但是如果一个孩子可以有很多父母,那么在递归“树”时它本质上不会知道选择哪个父母(现在更像是一个图表)。

    那么在您的数据模型中,Parts 是否必须有多个 Kits?因为如果您将KitPart 之间的多对多关系更改为一对多关系,其中Kit 可以有许多Parts,但Part 只能有一个Kit,那么您可以将NSFetchedResultsController 上的sectionNameKeyPath 设置为@"kit.source.name" 以按名称排序,一切正常。

    当然我不知道你的应用程序是如何工作的,如果你确实需要KitPart 之间的多对多关系,但如果你这样做了,那么你可能无法使用NSFetchedResultsController,并且必须自己实现获取Sources 并实现UITableViewDataSource 方法:(

    【讨论】:

      【解决方案2】:

      对于多对多关系,您可以使用 NSFetchedResultsController 获得此结果

      看到这个答案:如何处理与 NSFetchedResultsController 的多对多关系?

      示例项目:https://github.com/dmathewwws/Many-to-Many-CoreData

      【讨论】: