如何在Ordered To-Many关系中重复项目?

时间:2012-06-10 00:11:37

标签: ios core-data nsarray relationship

在Xcode 4.3.2的核心数据中,有序To-Many关系使用NSOrderedSet建模。它运作良好,直到我发现需要在关系中重复项目;它应该真正建模在NSArray

例如,在音乐应用中,我有以下歌曲:SongA, SongB, SongC

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

[SongC, SongC, SongA, SongC]

Core Data目前的工作方式,列表将成为:

[SongC, SongA]

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

所以,回到我的问题:在核心数据的关系中按顺序建模重复项目的好方法是什么?

2 个答案:

答案 0 :(得分:2)

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

无论您是否使用有序关系特征,您都需要回到抽象的ER模型,找到将概念关系转换为核心数据模型的另一种方法...它可能有助于思考如何你可以在一个简单的SQL(或类似SQL)数据库中完成它,然后再回到Core Data之外的SQL。

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

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

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

答案 1 :(得分:1)

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

因此,您必须自己管理关联,而且您当然也必须自己管理关联的有序部分。

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

ScoreSong具有以下属性:

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

然后,您必须使用带有排序描述符的获取请求作为键顺序,这将返回ScoreSong的有序NSArray。您可以要求获取请求预取歌曲,然后您可以通过一次调用valueForKey来创建仍然正确排序的歌曲数组:@“song”。

当你需要在乐谱中多次包含歌曲时,你必须为一首歌曲创建不同的ScoreSong。这是增加间接的全部要点。