sectionNameKeyPath通过多个关系

时间:2010-09-20 16:50:11

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

我正在开发一款使用核心数据和NSFetchedResultsController的应用。模型设置如下:

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

因此,PartKit具有多对多的关系(一部分可以在一个或多个工具包中,而工具包可以包含一个或多个部分)。每个Kit来自Source,可能会提供一个或多个Kit

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

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

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

谢谢!

2 个答案:

答案 0 :(得分:0)

我不这么认为,因为NSFetchedResultsController不会知道用哪Kit来排序Part,因为这是一个很多关系。

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

因此,在您的数据模型中,Part必须有多个Kit s?因为如果您将KitPart之间的多对多关系更改为多对多关系,那么Kit可以有多个Part s,但是{{1}只能有一个工具包,然后您可以将Part上的sectionNameKeyPath设置为NSFetchedResultsController以按名称排序,一切都会正常工作。

当然,如果您真的需要@"kit.source.name"Kit之间的多对多关系,我不确切知道您的应用是如何运作的,但如果您这样做,那么您可能不会能够使用Part,并且必须实现提取NSFetchedResultsController并自行实施Source方法:(

答案 1 :(得分:0)

您可以使用NSFetchedResultsController为多对多关系获取此结果

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

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