3

所以,我只是开始真正享受 Core Data,并开始将它集成到我正在开发的应用程序中。但是,我遇到了一个我看不到明显解决方案的问题,这让我觉得 Core Data 可能不是适合这项工作的工具。情况如下:我有一棵由Nodes 组成的树,每个树都可能有孩子,也可能没有孩子。可以有任意多个 root Node。我已经使用一对多关系(从NodeNodes)和一对一逆关系组合了数据模型。这一切都很好。

现在,每个都与 sNode具有一对多关系,与Records 也具有一对一的反比关系Node。我想要做的是找到所有Record将特定布尔属性设置为 true 并且位于给定Node. 在我使用 Core Data 之前,这非常容易——我只是走在树上。然而,这很耗时,我希望 Core Data 能给我一种方法来发出一个获取请求,它可以Record快速获取我想要的所有 s。如果我知道要检查的最大深度,我可以很容易地看到如何做(半),但是如果我想一直向下怎么办?如果不是所有人Node都有孩子怎么办?

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

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

4

1 回答 1

2

这不是核心数据问题,而是图形问题。你必须做同样的搜索。但是,CoreData 可以让您在对象中出错。所以,你有几个选择,其中两个是

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

2)对每条记录中的父关系进行编码。更新树时会进行大量更新,但获取速度会更快。

以下可以转换为 NSCompoundPredicate 并分配为 fetch 谓词...文档说它适用于 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];
}
于 2012-04-11T23:27:51.673 回答