0

假设我在 Core Data 中有一个 Song 实体和 Genre 实体。流派有很多歌曲。

我想执行一个获取请求来获取所有歌曲的流派。这意味着流派会出现多次。或者,用 SQL 术语来说,

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

我意识到 SQL 等效项有点牵强,因为我不需要外键/主键。目标是一样的。看起来很简单,但我在研究中找不到完全适合我的问题的答案。

我的最终目标是汇总类型并计算它们,就像在这篇文章中一样。同样,用 SQL 术语来说:

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

我希望通过对这个问题的理解,我可以从链接中添加代码以获得我想要的东西。随意告诉我,如果 CD 不能那样工作,它就不会工作。

4

2 回答 2

0

为什么不直接为没有 NSPredicate 的“流派”实体创建一个 NSFetchRequest?您将获得所有流派实例。还是您只想要有歌曲的流派?如果是这样,您可以在此处找到示例。

于 2012-10-26T02:03:36.587 回答
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:@"songs.@count"]);
}
于 2012-10-26T04:05:39.070 回答