我昨天问了一个问题,我真的应该从一个更简单的例子开始。将我的问题提炼为基础知识后,我设法使用现有的 SO 问题和答案解决了我的问题。
我在这里总结我的问题(并提供我自己的解决方案),因为我认为没有任何帖子足够清楚地解释这一点。作为 Core Data 的新手并努力摆脱 SQL 概念,我欢迎就我的解决方案的适用性以及是否有更好的问题建模方法提供反馈。
问题
给定以下对象模型,它具有三个实体 A、B 和 C,每个实体由一对多关系链接:
如何识别具有具有特定属性的孙C实体的父A实体?例如,使用这些示例实体及其关系:
我怎样才能找到我们的哪个实体A有带有标签的子实体C:是?
解决方案
我已经能够通过使用SUBQUERY
关键字来实现这一点NSPredicate
。这是对我有用的代码片段(假设您已经设置了托管对象上下文等):
NSError *error = nil;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"EntityA" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSPredicate *predicateTemplate = [NSPredicate predicateWithFormat:@"(0 != SUBQUERY(child, $a, (0 != SUBQUERY($a.child, $child, $child.tag == %@).@count)).@count)", @"YES"];
[fetchRequest setPredicate:predicateTemplate];
NSArray *test = [context executeFetchRequest:fetchRequest error:&error];
将所有重要的 NSPredicate 字符串分成几行:
(0 != SUBQUERY(child,
$a,
(0 != SUBQUERY($a.child,
$child,
$child.tag == %@).@count)
).@count
)
重要的部分是我们选择EntityA
要从中工作的对象,然后在嵌套子查询child
中处理实体的关系。我希望这可以重复几个深度。放在一起不是最直观的东西......但它确实有效。欢迎评论。