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

时间:2015-11-20 00:20:12

标签: ios objective-c core-data ios9

假设我有一个名为Playlist的NSManagedObject子类。此Playlist对象与另一个名为Song的NSManagedObject子类具有多对多关系。假设我的Playlist对象在关系中有一首与其相关的歌曲“歌曲A”。

鉴于这个例子,我试图再次为这段关系添加“歌曲A”,将两首相同的歌曲添加到播放列表中。

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

- (void)addSongsObject:(Song *)theSong {
    NSMutableOrderedSet *song = [self mutableOrderedSetValueForKey:@"songs"];
    [mutableSongs addObject:theSong];
}

其中self是播放列表对象。由于关系中已存在特定歌曲的实例,因此不会添加另一个实例。

使用Core Data进行此操作的最佳方式是什么?

1 个答案:

答案 0 :(得分:2)

就像我在评论中提到的那样,解决方案是在层次结构中插入一个中间容器对象,以表示播放列表中给定歌曲的每个(唯一)出现;我们称之为SongOccurrenceSongInstance也会这样做。)

因为核心数据中的多对关系使用NSSet进行建模(这是无序的,但也要求每个元素最多出现一次,与NSArray不同),您无法添加相同的实例一首歌两次或更多。

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

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

播放列表时,您只需按SongOccurrenceindex个实例进行排序,检索每个Song“有效负载”,然后依次播放