2015-11-20 52 views
1

假設我有一個名爲Playlist的NSManagedObject子類。這個Playlist對象與另一個名爲Song的NSManagedObject子類具有多對多關係。假設我的Playlist對象在關係中有一首與歌曲「歌曲A」相關聯的歌曲。核心數據爲多對多關係添加相同的對象

考慮到這個例子,我試圖再次向關係中添加「歌曲A」,la將兩首歌曲添加到播放列表中。

下面是用於添加對象到關係碼:

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

哪裏self是播放列表對象。由於關係中已有特定歌曲的實例,因此不會添加另一個實例。

什麼是最好的方式去做這個與核心數據?

+1

也許做一個名爲「SongOccurrence」的中間包裝對象。這些在列表中也是獨一無二的,但其中兩個可能引用相同(獨特的)歌曲。 –

+1

@NicolasMiari你應該做出答案而不是評論。這真的是唯一體面的解決方案。 –

+0

我剛剛做到了;抱歉。我在我的iPhone上隨便瀏覽,因此不想輸入完整的答案。 –

回答

2

就像我在我的評論中提到的,解決方法是在層次結構中插入一箇中間容器對象,以表示播放列表中給定歌曲的每個(唯一)出現;我們稱之爲SongOccurrenceSongInstance也會這樣)。

由於核心數據中的多對一關係使用NSSet(它是無序的,但要求每個元素最多出現一次,與NSArray不同)建模,因此無法將歌曲的同一個實例添加兩次或更多次。

所以,這SongOccurrence對象有向(唯一的)Song它所代表的引用(以及存儲在其他地方,唯一-say,Library),並可能代表了其在播放列表順序的index屬性。

可以使用表示對象的唯一ID的字符串或int屬性來建模「參考」(使用關係也需要設置相反的關係)。由於給定歌曲可能屬於多個播放列表,所以它必須是「一對多」)。

當播放列表中,您只需在設置中SongOccurrence情況下通過他們的index排序,檢索每個Song「有效載荷」,並播放一前一後。

+0

我不是核心數據專家,但如果您發現任何錯誤或不準確之處,請告知我們。 –

+0

感謝您的回覆!我會看看這個。 – hgwhittle

+1

個人而言,我認爲值得將SongOccurrence-Song建模爲一種關係,並用一對多的反轉法進行建模是值得的:如果沒有別的辦法,它就避免了必須創建一個唯一的ID,並且在刪除一首歌時幫助保持參照完整性。 – pbasdf