gpt4 book ai didi

iphone - 嵌套树结构中的核心数据获取请求

转载 作者:行者123 更新时间:2023-12-03 19:56:15 28 4
gpt4 key购买 nike

所以,我刚刚开始真正喜欢 Core Data,并开始将其集成到我正在开发的应用程序中。然而,我遇到了一个没有明显解决方案的问题,这让我觉得 Core Data 可能不是完成这项工作的正确工具。情况是这样的:我有一棵 Node 的树s,每个人可能有也可能没有 child 。可能有任意多个根Node s。我使用一对多关系(从 NodeNode )和一对一逆关系将数据模型组合在一起。一切都很好。

现在,每个NodeRecord 也有一对多关系s,也与 Node 具有反一关系。 。我想做的是找到所有Record特定 bool 属性设置为 true,并且低于给定的 Node 。在我使用 Core Data 之前,这非常简单——我只需走树即可。然而,这很耗时,我希望 Core Data 能给我一种方法来发出一个获取请求,该请求将获取所有 Record我要快点。如果我知道我想要检查的最大深度,我可以轻松地看到如何(半)轻松地做到这一点,但是如果我想一直向下怎么办?如果不是全部怎么办Node有 child 吗?

我应该像以前那样在树上行走吗?

NSFetchRequest甚至有能力执行这样的任务?

最佳答案

这不是核心数据问题,而是图形问题。您必须进行相同的搜索。但是,CoreData 可以允许您对对象进行故障处理。因此,您有多种选择,其中两个是

1) 走树。您应该能够使用与内存树中使用的完全相同的算法。 CoreData 应该只是在对象中出现错误。除非你有一棵非常深的树,否则应该没问题。

2) 对每条记录中的父关系进行编码。更新树时会进行相当多的更新,但获取会更快。

以下内容可以转换为 NSCompoundPredicate 并指定为获取谓词...文档说它适用于 CoreData,但不适用于 sqllite - 尝试一下。

NSPredicate *nodePredicate = [NSPredicate predicateWithFormat:@"field = %@", value];
// Use nodePredicate to find ones that match the ones you want to find
// Then use a block predicate to see if the parent is there.
NSArray *potential = [context executeFetchRequest:fetchRequest error:&error];
if (!error) {
NSPredicate *parentPredicate = [NSPredicate predicateWithBlock:^BOOL(id obj, NSDictionary *bindings) {
Node *node = obj;
while (node) {
if ([node.parent.nodeId isEqualToString:targetId) return YES;
node = node.parent;
}
return NO;
}];
NSArray *foundNodes = [potential filteredArrayUsingPredicate:parentPredicate];
}

关于iphone - 嵌套树结构中的核心数据获取请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10041355/

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