2012-10-25 43 views
0

假設我在Core Data中有Song實體和Genre實體。流派有許多歌曲。提取所有Core Data子實體

我想執行取回請求來獲取所有歌曲的流派。這意味着流派會多次出現。或者,用SQL語言來說,

select G.* 
    from Songs S 
     join Genres G on G.id = S.genre_id 

由於我不需要外鍵/主鍵,我意識到SQL的等價性有點誇張。目標是一樣的。這似乎很簡單,但我無法在我的研究中找到適合我的問題的答案。

我的最終目標是聚合流派並對它們進行計數,like in this post。再次,在SQL方面:

select G.name, count(*) 
    from Songs S 
     join Genres G on G.id = S.genre_id 
group by G.name 

我希望從這個問題的理解,我可以從鏈接中添加代碼來獲得我想要的東西。隨意告訴我,如果CD不能這樣工作,它將無法正常工作。

回答

0

假設在你的核心數據模型中,每個流派與一首歌曲都有多對多的關係,下面將給出每個流派的歌曲數量(實際上是聚合你的流派並對它們進行計數),其中流派附有至少1首歌曲:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY songs != NULL"]; 
NSEntityDescription *genres = [NSEntityDescription entityForName:@"Genre" 
              inManagedObjectContext:moc]; 
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
[request setEntity:genres]; 
[request setPredicate:predicate]; 
NSError *error; 
NSArray *genresArray = [moc executeFetchRequest:request error:&error]; 
NSLog(@"Total number of genres that have songs: %d", genresArray.count); 
for (NSManagedObject *genre in genresArray) { 
    NSLog(@"Genre: %@ (%@)", [genre valueForKey:@"genreName"], [genre valueForKeyPath:@"[email protected]"]); 
} 
0

爲什麼不只爲沒有NSPredicate的「流派」實體創建一個NSFetchRequest?你會得到所有的流派實例。或者你只想要有歌曲的流派?如果是這樣,你可以找到一個例子here

+0

不是。你提出的建議將會給我每一種類型中的一種。通過查詢歌曲,但選擇流派,每種流派出現一次*每次使用*。 – spamguy

相關問題