Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 导航核心数据对象图[2]_Ios_Cocoa_Core Data_Nspredicate - Fatal编程技术网

Ios 导航核心数据对象图[2]

Ios 导航核心数据对象图[2],ios,cocoa,core-data,nspredicate,Ios,Cocoa,Core Data,Nspredicate,我昨天问了一个问题,我真的应该从一个更简单的例子开始。在将我的问题提炼为基本问题之后,我已经设法使用现有的SO问题和答案来解决我的问题 我在这里总结我的问题(并提供我自己的解决方案),因为我认为没有任何帖子能够足够清楚地解释这一点。作为核心数据的新手,我正在努力摆脱SQL的概念,我欢迎反馈我的解决方案有多合适,以及是否有更好的方法来建模问题 问题 给定以下对象模型,该模型有三个实体A、B和C,每个实体通过多个关系链接: 如何识别父级A实体,其子级C实体具有特定属性?例如,使用以下示例实体及其关

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

我在这里总结我的问题(并提供我自己的解决方案),因为我认为没有任何帖子能够足够清楚地解释这一点。作为核心数据的新手,我正在努力摆脱SQL的概念,我欢迎反馈我的解决方案有多合适,以及是否有更好的方法来建模问题

问题

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

如何识别父级A实体,其子级C实体具有特定属性?例如,使用以下示例实体及其关系:

我如何找到我们的哪个实体As有子实体Cs,标签为:Yes

解决方案

我已经能够通过使用
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"]];

希望这有帮助

是的,我已经建立了互惠关系。在代码中,我究竟如何实现“向上父母”呢?是的,我已经建立了互惠关系。我如何在代码中实现“向上父级”呢?谢谢,这看起来更符合核心数据的精神,而不是我的解决方案。谢谢,这看起来更符合核心数据的精神,而不是我的解决方案。