Iphone 帮助CoreData进行NSPredicate-递归搜索

Iphone 帮助CoreData进行NSPredicate-递归搜索,iphone,core-data,nspredicate,Iphone,Core Data,Nspredicate,我正在为一个iPhone项目使用CoreData,我一直在尝试构建一个谓词 我的核心数据实体是 Folder parent - Point to the folder class parent, can be null and is one to one. secure - An enum that holds the security type. 我的问题是,我正试图使它,所以我不显示任何文件夹中的安全文件夹 现在我的谓词看起来像这样 NSPredicate *pred =

我正在为一个iPhone项目使用CoreData,我一直在尝试构建一个谓词

我的核心数据实体是

Folder 
   parent  - Point to the folder class parent, can be null and is one to one.
   secure  - An enum that holds the security type.
我的问题是,我正试图使它,所以我不显示任何文件夹中的安全文件夹

现在我的谓词看起来像这样

NSPredicate *pred = [NSPredicate predicateWithFormat:@"secure = $@ AND (parent = %@ OR parent.secure = %@)",[NSNumber numberWithInteger:kNoSecurity], [NSNull null], [NSNumber numberWithInteger:kNoSecurity]];
当我只有一个像folder1->folder2这样的链,并且folder1是安全的时,这就可以找到了。但是如果我有folder1->folder2->folder3(folder2和folder3不安全)。Folder3被返回,因为我只检查了一个级别。有没有办法让谓词对整个链进行检查


谢谢

为什么不使用
kNoSecurity
抓取所有文件夹实体

NSPredicate *pred = [NSPredicate predicateWithFormat:@"secure = %@ ", [NSNumber numberWithInteger:kNoSecurity]];

通过关系重新开始怎么样:

NSPredicate *pred = [NSPredicate predicateWithFormat:"parent.secure = %@", [NSNumber numberWithInteger:kNoSecurity]];
问题是这只会上升 一级。所以如果我有folder1-> folder2->folder3->folder4,以及 folder1是安全的。那么folder2就不是了 显示但folder3和folder4是

您不能递归地遍历谓词中的关系,因为关键路径只描述抽象实体之间的关系,而不描述实际包含数据的具体、活动的托管对象。实体图可以非常简单,但在运行时填充时会生成非常复杂的活动对象图。用简单的键路径无法从逻辑上捕获活动图的复杂性

在这种情况下,您有一个与自身有关系的
文件夹
实体,称为
父项
,属性为
安全
。因此,密钥路径最多只能用path
parent.secure
描述这两个属性。无法创建
parent.parent.secure
的密钥路径,因为实体图中实际上不存在此类关系。这样的路径有时只存在于活动对象图中。逻辑上不可能硬编码一条路径,该路径可能存在,也可能不存在,具体取决于任何给定时间的数据细节

在这种情况下,创建定制的NSManagedObject子类的功能就派上了用场。您的
文件夹
实体不必只是哑数据,您可以向它们添加行为,以便每个对象都可以访问自己的状态并根据需要返回不同的数据

在本例中,我建议添加一个名为
hassecurancestor
的临时布尔属性。然后创建一个自定义getter方法,如:

- (BOOL) hasSecureAncestor{
    BOOL hasSecureAncestor=NO;
    if (self.parent.secure==kNoSecurity) {
        hasSecureAncestor=YES;
    }else {
        if (self.parent.parent!=nil) {
            hasSecureAncestor=self.parent.hasSecureAncestor;
        }else {
            hasSecureAncestor=NO;
        }
    }
    return hasSecureAncestor;
}

然后只需创建一个谓词来测试“hassecurancetor==YES”。自定义访问器将遍历任意深度的递归关系,寻找安全的祖先

似乎evanchri不想选择父文件夹(在任何级别)安全的文件夹。Seamus你是对的。我只想查看不在安全文件夹中的文件夹。我不确定您是否可以将其封装在一个谓词中。如果任何父文件夹是安全的,或者您位于文件夹树的根目录,您可能需要执行递归搜索并停止。因此,基本上我必须搜索从NSFetchResults返回的每个项目,并手动查看它们是否受到保护?有没有办法让它与NSFetchResultsController一起工作?换句话说,使用NSManagedObject列表构建NSFetchResultsController?或者可以将它们从控制器中移除而不从商店中移除?感谢您的回复。我是在我的代码中这样做的,我只是忘了把它添加到我的代码中。问题是这只上升了一个层次。所以如果我有folder1->folder2->folder3->folder4,那么folder1是安全的。然后folder2不显示,但folder3和folder4显示。我没有遵循这个建议,我创建了一个祖先表,因为我真正的代码有一些要求没有在这里说明。但是这里提出的建议可以解决上述问题。是否真的可以创建一个访问瞬态属性的NSPredicate?我读到的其他东西都说它不起作用,至少在SQLite存储中不起作用。(见和)。