根据实体之间的关系类型创建 NSFetchedResultsController 部分

Posted

技术标签:

【中文标题】根据实体之间的关系类型创建 NSFetchedResultsController 部分【英文标题】:Creating NSFetchedResultsController sections based on type of relationship between entities 【发布时间】:2013-07-16 05:25:46 【问题描述】:

在我正在开发的应用程序中,我有一个核心数据模型,它具有 UsersWidgets,其中用户可以拥有许多 Widget 作为他们的 owner 或将小部件作为众多观察者之一。对于我的应用程序中的屏幕,我想显示一个包含两个部分的表格视图:第一个列出给定用户拥有的小部件,而另一个显示用户正在观看的小部件。

因此,基本上这归结为基于给定 Widget 是否通过 watchersowner 关系与用户相关的部分。有没有简单的方法来实现这一点?

【问题讨论】:

【参考方案1】:

您可以在用户和小部件之间建立两种关系。用户实体将拥有拥有小部件和监视小部件,而小部件实体将拥有所有者和观察者。

User                  Widget
------                --------
ownedWidgets <----->> owner
watchedWidgets <<-->> watchers

编辑

没有注意到问题标题中的NSFetchedResultsController!您遇到的问题是 FRC 使用 sectionNameKeyPath 属性来确定基于一个属性的部分。您已经使用关系完成了这项工作,并且没有一个属性可以涵盖这两种情况。

我的建议是从特定的用户实例 ownedWidgetswatchedWidgets 创建两个数组,使用您在 FRC 中使用的相同排序描述符进行排序,并将它们用于表视图。当 FRC 更新行时,您可以在调用 [tableView endUpdates] 之前重新创建这些数组。无需更改数据模型以适应一种视图控制器设计。

坦率地说,如果您已经拥有 User 对象,那么您已经通过关系获得了所需的小部件,因此您实际上不需要获取任何东西。您可能需要考虑是否真的需要 FRC。

如果您确实需要使用 FRC - Erik H. 的答案将是您的最佳选择。

【讨论】:

是的,这基本上就是我现在设置数据模型的方式;那不是问题。问题是我想根据它们是否与ownedWidgetswatchedWidgets 属性相关来将小部件拆分为多个部分。 是的,更新后的建议是我过去解决此问题的方式 - 如果您想自己做一些额外的工作来管理更改,这是一个好方法。但是,如果您确实想使用 FRC,我认为我的答案是可行的。 这似乎是建议的最佳方法。今晚我将尝试实施这种方法。【参考方案2】:

这取决于您的数据模型。我认为一种方法可以通过使用中间对象UserWidget 并为关系类型、所有者或观察者具有属性(如relationshipType)来实现这一点。那么你的 fetch 可以在 UserWidgets 上,sectionNameKeyPath 可以是 relationshipType

【讨论】:

这实际上似乎是一个很好的解决方案。也许有点数据库,但如果 UserWidget 连接实体只是对常规关系增加了一层冗余,它可能会起作用。

以上是关于根据实体之间的关系类型创建 NSFetchedResultsController 部分的主要内容,如果未能解决你的问题,请参考以下文章

核心数据中的触发器

无法在实体之间创建一对一关系

如何在多个实体到另一个实体之间创建 NHibernate 关系映射(即继承映射)

如何在 NHibernate 实体之间创建三向关系?

是否可以在表之间创建关系?

MS Access 无法在实体和桥接表之间创建一对多关系