获取所有核心数据子实体
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。
【讨论】:
不。你的建议将给我每一个流派中的一个。通过查询歌曲但选择流派,每个流派每次使用显示一次。以上是关于获取所有核心数据子实体的主要内容,如果未能解决你的问题,请参考以下文章