导航核心数据对象图

昨天我问了一个问题 ,我真的应该从一个更简单的例子开始。 在将我的问题提炼到基础知识之后,我已经设法使用现有的SO问题和答案来解决我的问题。

我在这里总结了我的问题(并提供了我自己的解决方案),因为我认为没有任何post能够清楚地解释这一点。 作为Core Data的新手并且正在努力摆脱SQL概念,我欢迎提供有关我的解决方案的适当性的反馈,以及是否有更好的方法来解决问题。

给定以下对象模型,它有三个实体A,B和C,每个实体由多对多关系链接:

模型

如何识别具有特定属性的孙子C实体的父A实体? 例如,使用这些样本实体及其关系:

例

如何找到我们哪个实体A具有带有标签的子实体C s:是的?

我已经能够实现这一点,使用的是SUBQUERY关键字。 以下是适用于我的代码段(假设您已设置了托管对象上下文等):

 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关系。 我希望这可以重复几个深度。 不是最直观的东西放在一起……但它的工作原理。 欢迎评论。

我之前从未尝试过使用子查询,看到它的一个例子非常酷。 您应该添加解决方案作为实际问题的答案!

我可能会像Abizern建议的那样完成,因为这是一个树状的层次结构,并且使用一对一的关系更容易遍历树。

在代码中,这看起来像:

 NSManagedObjectContext *moc = APPDELEGATE.managedObjectContext; NSFetchRequest *request = [NSFetchRequest new]; [request setEntity:[NSEntityDescription entityForName:@"EntityC" inManagedObjectContext:moc]]; [request setPredicate:[NSPredicate predicateWithFormat:@"tag = YES"]]; NSError *fetchError = nil; NSArray *children = [moc executeFetchRequest:request error:&fetchError]; 

children是与谓词匹配的EntityC对象数组。 下一步是获取一组独特的EntityA对象,这些对象是这些对象的“祖父母”。 我们可以在这里利用键值编码:

 NSArray *grandParents = [children valueForKeyPath:@"parent.@distinctUnionOfObjects.parent"]; 

在这种情况下,为了提高效率,我们可能希望在初始提取请求期间预取parent.parent键路径:

 [request setRelationshipKeyPathsForPrefetching:@[@"parent.parent"]]; 

希望这可以帮助!

如果您已遵循核心数据准则并建立了互惠关系,则可以尝试从下往上进行搜索。

获取传递所需谓词的实体C对象,然后通过上移父项获取实体A对象。 不需要嵌套子查询。

编辑添加

您可以从parent关系中获取C的父级(它是B的对象)。 从那里你可以得到父母(它是A的一个对象)形成parent关系。

它位于您的核心数据模型图中。