Ios 导航核心数据对象图[2]
我昨天问了一个问题,我真的应该从一个更简单的例子开始。在将我的问题提炼为基本问题之后,我已经设法使用现有的SO问题和答案来解决我的问题 我在这里总结我的问题(并提供我自己的解决方案),因为我认为没有任何帖子能够足够清楚地解释这一点。作为核心数据的新手,我正在努力摆脱SQL的概念,我欢迎反馈我的解决方案有多合适,以及是否有更好的方法来建模问题 问题 给定以下对象模型,该模型有三个实体A、B和C,每个实体通过多个关系链接: 如何识别父级A实体,其子级C实体具有特定属性?例如,使用以下示例实体及其关系: 我如何找到我们的哪个实体As有子实体Cs,标签为:Yes 解决方案 我已经能够通过使用Ios 导航核心数据对象图[2],ios,cocoa,core-data,nspredicate,Ios,Cocoa,Core Data,Nspredicate,我昨天问了一个问题,我真的应该从一个更简单的例子开始。在将我的问题提炼为基本问题之后,我已经设法使用现有的SO问题和答案来解决我的问题 我在这里总结我的问题(并提供我自己的解决方案),因为我认为没有任何帖子能够足够清楚地解释这一点。作为核心数据的新手,我正在努力摆脱SQL的概念,我欢迎反馈我的解决方案有多合适,以及是否有更好的方法来建模问题 问题 给定以下对象模型,该模型有三个实体A、B和C,每个实体通过多个关系链接: 如何识别父级A实体,其子级C实体具有特定属性?例如,使用以下示例实体及其关
NSPredicate
的子查询关键字来实现这一点。下面是对我有用的代码片段(假设您已经设置了托管对象上下文等):
将所有重要的NSPredicate字符串拆分为几行:
(0 != SUBQUERY(child,
$a,
(0 != SUBQUERY($a.child,
$child,
$child.tag == %@).@count)
).@count
)
重要的部分是我们选择要从中工作的EntityA
,然后在嵌套子查询中通过实体的子关系工作。我希望这可以重复几个深度。不是最直观的东西放在一起。。。但它是有效的。欢迎评论。如果您遵循了核心数据指南并建立了互惠关系,您可以尝试从下至上进行搜索
获取通过所需谓词的实体C对象,然后通过向上搜索父对象来获取实体A对象。不需要嵌套子查询
编辑以添加
您可以从parent
关系中获取C的父对象(B的对象)。从那里,您可以从parent
关系中获得父对象(A的对象)
它在您的核心数据模型图中。如果您遵循了核心数据指南并建立了互惠关系,您可以尝试自下而上进行搜索
获取通过所需谓词的实体C对象,然后通过向上搜索父对象来获取实体A对象。不需要嵌套子查询
编辑以添加
您可以从parent
关系中获取C的父对象(B的对象)。从那里,您可以从parent
关系中获得父对象(A的对象)
它在您的核心数据模型图中。我以前从未尝试过使用子查询,看到它的示例非常酷。事实上,你应该把答案作为问题的答案添加进去
我可能会按照Abizern的建议去做,因为这是一个类似于树的层次结构,使用to-one关系更容易遍历树
在代码中,这看起来像:
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
keypath:
[request setRelationshipKeyPathsForPrefetching:@[@"parent.parent"]];
希望这有帮助 我以前从未尝试过使用子查询,这非常酷,很高兴看到它的一个例子。事实上,你应该把答案作为问题的答案添加进去
我可能会按照Abizern的建议去做,因为这是一个类似于树的层次结构,使用to-one关系更容易遍历树
在代码中,这看起来像:
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
keypath:
[request setRelationshipKeyPathsForPrefetching:@[@"parent.parent"]];
希望这有帮助 是的,我已经建立了互惠关系。在代码中,我究竟如何实现“向上父母”呢?是的,我已经建立了互惠关系。我如何在代码中实现“向上父级”呢?谢谢,这看起来更符合核心数据的精神,而不是我的解决方案。谢谢,这看起来更符合核心数据的精神,而不是我的解决方案。