我正在尝试做与NSFetchResultsController + sectionNameKeyPath + section order中的帖子完全相同的事情,即基本上使用2个表格,让我们说类别< - >>活动。类别表仅包含类别字段,而事件包含名称,dateTimestamp。 我在Events表中定义了关系'category',并在创建fetchedResultsController时尝试将该关系用作sectionNameKeyPath:
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"category.category" cacheName:@"Root"];
最后,我在加载应用程序时预先填充了一些类别的类别表(并通过.dump验证表格是否正确填充)
然而,我模拟器失败了:
return [[self.fetchedResultsController sections] count];
我进行了广泛的搜索,大多数人建议使用表中的一个字段作为sectionNameKeyPath(这个工作!)或瞬态属性(也可以!)但是,我只是想使用关系,因为它对我来说似乎很合乎逻辑在这种情况下,事件属于某些类别,并且可能存在没有事件的类别。我假设关系可以用作sectionNameKeyPath,我错了吗?问题顶部的原始链接表明它有效,但是家伙不知道为什么或如何。
表示,对于可以作为sectionNameKeyPath使用的内容,文档非常薄弱,因此任何帮助都将受到高度赞赏。答案 0 :(得分:2)
关系会为您提供指向托管对象的指针。但是,似乎合乎逻辑的是sectionNameKeyPath
参数应该是导致字符串的关键路径,因为NSFetchedResultsSectionInfo的name
属性是一个字符串。获取的结果控制器将遵循每个获取对象的该键路径,并根据它们为该键路径返回的内容将对象分组为多个部分,并且它还将使用这些字符串作为其各自部分的名称。您不能使用托管对象作为名称 - 您必须使用托管对象的某些字符串属性。
因此,您的类别实体必须具有区分一个类别与另一个类别的属性,对吧?使用它作为关键路径和(如你所见)一切都会成功。
顺便说一句,我认为尝试摆脱数据库(行/字段)思维模式并尝试以面向对象的术语(如实体和属性)进行思考是有用的。 Core Data的一大卖点是它提供了一个隐藏存储机制的抽象层。根据表格进行思考就像在阅读或编写文件时考虑块和扇区一样。答案 1 :(得分:0)
Caleb,谢谢你的回答。我相信我的理解在某种程度上是错误的。我所拥有的是实体类别和实体事件。类别有一个字符串字段'category',因此'category.category'路径(第一个'category'是Event实体中的关系)
但我没有考虑的是,如果没有事件,fetchresultscontroller无法获取任何内容(类似于'left join')
我想要的是即使没有事件也要显示类别。在这种情况下,关系“类别”不会返回任何内容,因为没有任何内容可以返回/排序/分类。
我必须做的事情(错误或正确 - 尚未确定)是将从Category实体创建的[managed]对象视为单独的对象,以防表中没有事件和位置。当每个类别有一个事件时,我可以切换到[自动]显示按类别排序的事件的原始方法。
这是起点(有关系的空实体)的有趣问题,我认为核心数据比传统关系数据库更令人困惑。我也相信这就是为什么所有的书籍/文章/报告都要小心翼翼地远离这个话题。换句话说,我在核心数据中找不到“左连接”的模拟。可能是我错了,因为我对这一切都比较新。以下是实体的描述:
类别< - >>事件
类别 - 父母 Category.category - String类型的属性 Category.event - 与事件实体的关系
活动 - 孩子 Event.name - String类型的属性 Event.category - 与类别实体的关系
每个活动属于一个类别。类别可能有多个事件。 即使此类别没有事件,也应显示类别。
我试图将事件放在fetchresultscontroller下。也许我应该首先切换到Category,然后根据category.event关系计算单元格,而不是相反 - 没有尝试过。