2013-01-02 92 views
0

我是Core Data的新手。提取反向關係,而不是核心數據中的NSSet

在數據模型中我有實體:

  • Song
  • Playlist

這是關係:

  • Song不屬於任何一個或多個Playlist

的我已經加入到這樣的模型之間的關係。
我也做了相反對多關係

現在我的問題。

Playlist現在有NSSet與所有的Song s。
所以我可以通過playlist.songs訪問它們。

我可以使用NSPredicate取任何特定Song

- (NSArray *)fetchWithEntity:(NSString *)entity 
        predicate:(NSPredicate *)predicate 
      sortDescriptors:(NSArray *)sortDescriptors 
         error:(NSError **)error { 

    NSManagedObjectContext *moc = [self managedObjectContext]; 
    NSEntityDescription *entityDescription = [NSEntityDescription 
               entityForName:entity 
               inManagedObjectContext:moc]; 

    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setEntity:entityDescription]; 
    [request setPredicate:predicate]; 
    [request setSortDescriptors:sortDescriptors]; 

    NSArray *fetchResult = [moc executeFetchRequest:request error:error]; 
    return fetchResult; 
} 

然而,我想是可能的過濾Song秒的特定播放列表的太,而不是過濾NSSetNSPredicate,因爲它速度更快。

我該怎麼做?

回答

2

獲取特定播放列表的歌曲,只需將"playlist = %@"添加到用於提取對象的謂詞中,例如,

[NSPredicate predicateWithFormat:@"playlist = %@ AND title CONTAINS[cd] %@", 
      thePlaylist, songTitle] 

或者,如果播放列表是由標題中所列:

[NSPredicate predicateWithFormat:@"playlist.title = %@ AND title CONTAINS[cd] %@", 
      playlistTitle, songTitle] 

編輯如果有許多到許多歌曲和播放列表之間的關係,你可以定義playlists以─一對多的關係從播放列表,爲songs反比關係。然後下面的謂詞應該工作:

[NSPredicate predicateWithFormat:@"ANY playlist = %@ AND title CONTAINS[cd] %@", 
      thePlaylist, songTitle] 
+0

不幸的是,因爲歌曲沒有'播放列表'屬性。該歌曲可以添加到多個播放列表中... – NSAddict

+0

@NSAddict:好的抱歉,沒有正確閱讀。所以這是Song和Playlist之間的多對多關係? –

+0

是的。所以播放列表有一個屬性'歌曲',但歌曲不知道它是什麼播放列表。 – NSAddict