获取所有核心数据子实体

Posted

技术标签:

【中文标题】获取所有核心数据子实体【英文标题】:Fetching all Core Data subentities 【发布时间】:2012-10-25 22:32:47 【问题描述】:

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

我想执行一个获取请求来获取所有歌曲的流派。这意味着流派会出现多次。或者,用 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 不能那样工作,它就不能工作。

【问题讨论】:

【参考方案1】:

假设在您的核心数据模型中,每个流派都与一首歌曲存在一对多关系,以下将为您提供每种流派的歌曲计数(实际上是聚合您的流派并计算它们),其中流派是附加到至少 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"]);

【讨论】:

【参考方案2】:

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

【讨论】:

不。你的建议将给我每一个流派中的一个。通过查询歌曲但选择流派,每个流派每次使用显示一次。

以上是关于获取所有核心数据子实体的主要内容,如果未能解决你的问题,请参考以下文章

获取核心数据实体,但不获取子实体

子查询谓词核心数据

基于实体关系的核心数据获取

iPhone核心数据得到孙子

获取“最新”单个实体的最简单 Fetch 请求 - 核心数据

核心数据父实体