0

我的核心數據模型是這個樣子:核心數據的最佳實踐來獲取到許多對象

Song 
===== 
name 
duration 
album 

inPlaylists (to many relationship) 

Playlist 
======== 
title 

songs (to many relationship) 

每個PlaylistSong反之亦然許多一對多的關係。

我有一個播放列表視圖控制器,它提供了一個Playlist對象的列表。
要填充播放列表的tableview我用創建NSFetchRequest的常規方式,用NSFetchedResultsController使用它:

NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Playlist"]; 
request.predicate = nil; 
request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"title" ascending:YES]]; 
request.fetchBatchSize = 20; 

self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request 
                    managedObjectContext:self.context 
                     sectionNameKeyPath:nil 
                       cacheName:nil]; 

一旦用戶點擊一個播放列表行,我要推的是顯示播放列表中的歌曲其他視圖控制器。

我的問題是如何獲取播放列表歌曲? 我知道我有播放列表對象,所以我可以通過調用playlist.songs.allObjects來獲取它的歌曲數組,但我不確定這是多高效,並且我想使用NSFetchedResultsController,因此我可以使用它的所有委託方法來更新tableview。

那麼這種基本情景的最佳做法是什麼?

順便說一句,因爲你可以看到播放列表實體沒有playlistId屬性,我讓核心數據處理鍵,所以如果可能的話,我寧願不添加此屬性。

回答

2

要顯示所選播放列表中的所有歌曲在表視圖中,您將創建一個 獲取結果控制器(像你一樣的播放表),但 與爲Song實體提取請求:

NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Song"]; 

以及使用來自「歌曲」到「播放列表」的反比關係謂詞:

request.predicate = [NSPredicate predicateWithFormat:@"ANY inPlaylists = %@", 
              selectedPlaylist]; 

的「ANY」關鍵字是必要的,因爲「inPlaylists」是一個對多的關係。

+0

非常感謝!還有一個問題,如果從歌曲到播放列表的關係是「一對一」(即歌曲只能有一個播放列表),現在應該是什麼謂詞? – Eyal

+1

@ user3149567:只需省略ANY:'...「inPlaylist = @」,selectedPlaylist]'。 –

+0

謝謝你的幫助:) – Eyal