gpt4 book ai didi

ios - 浏览核心数据对象图 [2]

转载 作者:行者123 更新时间:2023-12-03 16:54:52 26 4
gpt4 key购买 nike

我问了question昨天我真的应该从一个更简单的例子开始。将我的问题提炼到基础知识后,我成功地使用现有的问题和答案解决了我的问题。

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

问题

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

Model

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

example

如何找到哪个实体 A 拥有带有标签的子实体 C :是?

解决方案

我已经能够通过使用 NSPredicateSUBQUERY 关键字来实现这一点。这是对我有用的代码片段(假设您已经设置了托管对象上下文等):

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,然后在嵌套子查询中处理实体的关系。我希望这可以重复几个深度。这不是最直观的组合方式……但它确实有效。欢迎评论。

最佳答案

我以前从未尝试过使用子查询,这非常酷,很高兴看到它的示例。您实际上应该添加解决方案作为问题的答案!

我可能会按照 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 对象,它们是这些对象的“祖 parent ”。我们可以在这里利用键值编码:

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

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

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

希望这有帮助!

关于ios - 浏览核心数据对象图 [2],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12750377/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com