将 NSFetchedResultsController 与 3 个相关的 CoreData 项一起使用时出错

Posted

技术标签:

【中文标题】将 NSFetchedResultsController 与 3 个相关的 CoreData 项一起使用时出错【英文标题】:Errors when using NSFetchedResultsController with 3 related CoreData items 【发布时间】:2010-07-17 18:39:57 【问题描述】:

我正在为一家餐厅编写一个应用程序,并希望在分区表视图中显示餐厅菜单。在表格视图上方,我有一个 UISegmentedControl,它控制要显示的菜单部分(食物或酒)。表格应显示按部分分隔的菜肴(例如开胃菜、肉类等)。

我有 3 个相关实体 MenuSections、MenuSubsections 和 MenuItems,它们是从服务器更新的(项目经常更改),所以我想显示保存的数据并在后台进程下载任何更改时重新加载。

到目前为止一切顺利,但现在我在尝试检索数据时遇到了一些问题。

初始化控制器时,我需要在 MenuSections.menuSubsection.name 中定义“sectionNameKeyPath”,但出现错误提示“此处不允许使用多对多键”。 我想对 MenuSubsections 和 MenuItems 进行排序,但再次出现错误“此处不允许使用多对多键”。

任何人都可以对此有所了解,因为我无法找到任何信息:-(

提前致谢, 米格尔

更新: 在 XCDataModel 中创建的项目:

MenuSections: 
id (int16)
name (string)
modified (date)
menuSubsections (relation to-many with MenuSubsections)

MenuSubsections:
id (int16)
name (string)
modified (date)
menuSections (relation to-one with MenuSections)
menuItems (relation to-many with MenuItems)

MenuItems:
name (string)
modified (date)
price (decimal)
menuSubsections (relation to-one with MenuSubsections)

【问题讨论】:

详细描述您的实体和关系 嗨,Shaggy Frog,我已经用项目详细信息更新了我的问题...谢谢:-) 【参考方案1】:

您不能在节名称键路径中具有to-many 关系,因为获取的结果控制器不知道许多属性值中的哪一个与哪个节标题对应。

假设每个MenuSections 对象与10 个MenuSubsections 对象有关系,每个对象又与10 个MenuItems 对象有关系。即有 100 个MenuItems.name 属性可供选择。控制器应该为哪个部分选择哪个?

这里需要两张桌子。第一个显示MenuSections 对象并使用MenuSections.name 作为部分名称键路径。这些行是每个 MenuSections' 相关的 MenuSubsections 对象。选择一行应该推送一个详细信息表,显示该行的特定 MenuSubsections 对象的相关 MenuItems。

顺便说一句,按照惯例,实体名称是单数的。所以MenuSectionMenuSubsectionMenuItem。实体就像类定义。它们只有一个,就像有许多 NSString 对象但只有一个 NSString 类一样,所以我们不将类命名为 NSStrings。名称应反映单数性质。应为to-many 关系名称保留复数。

【讨论】:

感谢 TechZen,我不喜欢必须点击以显示部分详细信息的想法,而是更喜欢显示一个包含所有数据部分的表格。最后,我将丢弃 NSFRC 并将数据加载到字典中。 在 iPhone 上,用户会期待分层 UI,因为大多数应用程序都使用它。当然,这不是必需的,但除非您有充分的理由不使用它,否则您应该使用它。如果您确实使用多合一设计,我建议您对其进行彻底测试。令人惊讶的是,屏幕区域很小,这使得类似于视图的轮廓难以解释。

以上是关于将 NSFetchedResultsController 与 3 个相关的 CoreData 项一起使用时出错的主要内容,如果未能解决你的问题,请参考以下文章

CoreData、NSFetchedResultsController 和 performFetch:

将自己的博客园,打造成个人知乎

如何将thinkcmf导入eclipse

如何将Ios文件上传到

Javascript 将正则表达式 \\n 替换为 \n,将 \\t 替换为 \t,将 \\r 替换为 \r 等等

如何将视频文件转换格式