Ios 核心数据将相同的对象添加到多个关系中

Ios 核心数据将相同的对象添加到多个关系中,ios,objective-c,core-data,ios9,Ios,Objective C,Core Data,Ios9,假设我有一个名为Playlist的NSManagedObject子类。此Playlist对象与另一个名为Song的NSManagedObject子类具有多对多关系。假设我的播放列表对象在关系中有一首与之关联的歌曲“song A” 举个例子,我尝试再次将“歌曲A”添加到关系中,la将同一首歌曲添加到播放列表中两次 以下是将对象添加到关系的代码: - (void)addSongsObject:(Song *)theSong { NSMutableOrderedSet *song = [sel

假设我有一个名为
Playlist
的NSManagedObject子类。此
Playlist
对象与另一个名为
Song
的NSManagedObject子类具有多对多关系。假设我的
播放列表
对象在关系中有一首与之关联的歌曲“song A”

举个例子,我尝试再次将“歌曲A”添加到关系中,la将同一首歌曲添加到播放列表中两次

以下是将对象添加到关系的代码:

- (void)addSongsObject:(Song *)theSong {
    NSMutableOrderedSet *song = [self mutableOrderedSetValueForKey:@"songs"];
    [mutableSongs addObject:theSong];
}
其中,
self
是播放列表对象。由于关系中已经存在特定歌曲的实例,因此不会添加另一个实例


使用核心数据进行此操作的最佳方法是什么?

正如我在评论中提到的,解决方案是在层次结构中插入一个中间容器对象,以表示播放列表中给定歌曲的每个(唯一)出现;让我们称之为
songconcurrence
songconstance
也可以)

由于核心数据中的许多关系都是使用
NSSet
建模的(这是无序的,但也要求每个元素最多出现一次,与
NSArray
不同),因此不能将同一首歌曲的实例添加两次或两次以上

因此,这个
SongOccurrence
对象将引用它所代表的(唯一的)
Song
(并且存储在其他地方,唯一地,比如说,
Library
),可能还有一个
索引
属性,表示它在播放列表中的顺序

“引用”可以使用表示
歌曲
对象的唯一ID的字符串或int属性建模(使用关系也需要设置相反的ID。这会使事情变得复杂,因为给定的歌曲可能属于多个播放列表,所以它必须是“对多”)


播放列表时,您只需按
索引对集合中的
SongOccurrence
实例进行排序,检索每个实例的
Song
“有效负载”,然后依次播放。

也许可以制作一个名为“SongOccurrence”的中间包装对象。这些歌曲在列表中也是唯一的,但其中两首可能引用同一首(唯一的)歌曲。@NicolasMiari你应该回答而不是评论。这真的是唯一体面的解决办法;很抱歉我在iPhone上随意浏览,不想输入完整的答案。我不是核心数据专家,但如果您发现任何错误或不准确之处,请告诉我。谢谢您的回复!我来看看。就个人而言,我认为将SongOccurrence歌曲建模为一种关系是值得的,它包含了一个到多个逆:如果没有其他,它可以避免创建唯一的ID,并且在删除歌曲时有助于保持引用完整性。确定。我只是觉得包含的对象(SongOccurse)是“多”,而包含的对象(Song)是“一”,这是违反直觉的。通常情况正好相反。解决了它!我将Song和SongInstance的关系设置为“一”。将其更改为“到多个”解决了零的问题。谢谢你的帮助!