假设我有一个名为Playlist
的NSManagedObject子类。此Playlist
对象与另一个名为Song
的NSManagedObject子类具有多对多关系。假设我的Playlist
对象在关系中有一首与其相关的歌曲“歌曲A”。
鉴于这个例子,我试图再次为这段关系添加“歌曲A”,将两首相同的歌曲添加到播放列表中。
以下是将对象添加到关系中的代码:
- (void)addSongsObject:(Song *)theSong {
NSMutableOrderedSet *song = [self mutableOrderedSetValueForKey:@"songs"];
[mutableSongs addObject:theSong];
}
其中self
是播放列表对象。由于关系中已存在特定歌曲的实例,因此不会添加另一个实例。
使用Core Data进行此操作的最佳方式是什么?
答案 0 :(得分:2)
就像我在评论中提到的那样,解决方案是在层次结构中插入一个中间容器对象,以表示播放列表中给定歌曲的每个(唯一)出现;我们称之为SongOccurrence
(SongInstance
也会这样做。)
因为核心数据中的多对关系使用NSSet
进行建模(这是无序的,但也要求每个元素最多出现一次,与NSArray
不同),您无法添加相同的实例一首歌两次或更多。
因此,这个SongOccurrence
对象将引用它所代表的(唯一)Song
(并且存储在其他地方,唯一的-say,Library
)并且可能一个index
属性,表示播放列表中的顺序。
“引用”可以使用表示Song
对象的唯一ID的字符串或int属性建模(使用关系也需要设置反转。这使得自给定歌曲以来的事情变得复杂可能属于多个播放列表,因此它必须是“to-many”。
播放列表时,您只需按SongOccurrence
对index
个实例进行排序,检索每个Song
“有效负载”,然后依次播放