在Xcode 4.3.2的核心数据中,有序To-Many关系使用NSOrderedSet
建模。它运作良好,直到我发现需要在关系中重复项目;它应该真正建模在NSArray
。
例如,在音乐应用中,我有以下歌曲:SongA, SongB, SongC
,
我可能想要一个派对播放列表,其中人们以任何顺序插入歌曲并且可以重复。该列表可能类似于:
[SongC, SongC, SongA, SongC]
Core Data目前的工作方式,列表将成为:
[SongC, SongA]
即,所有重复的项目都被删除,因为它是用集合建模的。
所以,回到我的问题:在核心数据的关系中按顺序建模重复项目的好方法是什么?
答案 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。这是增加间接的全部要点。