0

在 Xcode 4.3.2 的 Core Data 中,Ordered To-Many 关系使用NSOrderedSet. 它运作良好,直到我发现需要在关系中重复项目;它真的应该以NSArray.

例如,在一个音乐应用程序中,我有以下歌曲SongA, SongB, SongC

我可能想要一个派对播放列表,人们以任何顺序插入歌曲并且可以重复。该列表可能类似于:

[SongC, SongC, SongA, SongC]

Core Data 当前的工作方式,列表将变为:

[SongC, SongA]

即,所有重复的项目都被丢弃,因为它是用集合建模的。

那么,回到我的问题:在 Core Data 的关系中按顺序对重复项进行建模的好方法是什么?

4

2 回答 2

2

关系是集合(有序关系是有序集合,但仍然是集合);根据定义,集合包含唯一对象。因此,无论哪种方式,您都不能将重复的对象放入关系中。

无论您是否使用有序关系功能,您都希望回到抽象的 ER 模型以找到另一种方法将您的概念关系转变为核心数据模型......这可能有助于考虑您如何在一个普通的 SQL(或类似 SQL)的数据库中完成它,然后回到 Core Data 在 SQL 之外所做的事情。

听起来你正在制作类似于 iTunes 播放列表的东西,不是吗?可能适用的模型将类似于:

 Playlist      <--->> PlaylistEntry
 PlaylistEntry <<---> Song

PlaylistEntry实体表示 aSong包含在一个中的一个实例Playlist。您可以有多个s在单个PlaylistEntrys 中引用相同的内容,并且可以向 s 添加其他属性以跟踪其他内容(例如歌曲顺序,如果您不使用有序关系)。作为奖励,如果您愿意,您可以使用它来添加其他功能 - 例如,制作一个播放列表,从一个长音轨中播放三个不同的片段。SongPlaylistPlaylistEntry

于 2012-06-10T05:42:03.143 回答
1

正如 rickster 所说,由 Core Data 管理的关系将它们之间的实体唯一地关联起来。即使 Lion 的核心数据(应该)支持有序关系(应该是,因为在实践中它不起作用,该功能有缺陷,几乎无法使用),它们仍然是遵循关系数据库模型的关系。

所以你必须自己管理关联,当然你也必须自己管理关联的有序部分。

Score <->> ScoreSong
ScoreSong <<-> Song

ScoreSong 具有以下属性:

ScoreSong:
- score: -> Score
- song: -> Song
- order: integer, indexed

然后,您必须使用带有排序描述符的 Fetch Request 键顺序,这将返回 ScoreSong 的有序 NSArray。您可以请求获取请求以预取歌曲,然后您可以创建歌曲数组,仍然正确排序,只需调用 valueForKey:@"song"。

当然,当您需要在乐谱中包含多首歌曲时,您必须为一首歌曲创建不同的 ScoreSong。这就是增加的间接性的全部意义所在。

于 2012-06-11T07:43:31.307 回答