Core data 在谓词中计算CoreData实体类型

Core data 在谓词中计算CoreData实体类型,core-data,nspredicate,nsfetchrequest,Core Data,Nspredicate,Nsfetchrequest,我有一个我精心设计的块谓词,只是为了发现不能在核心数据中使用它们 NSPredicate *rootContactPredicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) { BOOL isPersonAndRoot = ([[[evaluatedObject entity] name] isEqualToString:@"Person"] &

我有一个我精心设计的块谓词,只是为了发现不能在核心数据中使用它们

NSPredicate *rootContactPredicate = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {

        BOOL isPersonAndRoot = ([[[evaluatedObject entity] name] isEqualToString:@"Person"] && [[(Person*)evaluatedObject accounts] count] == 0);
        BOOL isAccountAndRoot = ([[[evaluatedObject entity] name] isEqualToString:@"Account"] && [(Account*)evaluatedObject root] == nil);

        return isPersonAndRoot || isAccountAndRoot;
    }];

因此,我需要将其转换为标准字符串格式谓词,但我不清楚如何检查求值对象的实体类型。
个人
账户
实体是
联系人
实体的子类,该实体是在获取请求中评估的类型。我希望它能看到子类型。

现在,您似乎可以简单地比较谓词中的实体,提供托管对象实体作为值:

"entity = %@"

以前:

你不能。原因是需要转换谓词,以便它可以在底层数据存储(可能是SQLite)上运行。SQLite数据库没有关于元素类型的任何数据,它只知道对象的键和值


根据您尝试执行的操作,您可能需要针对超级实体中已知的密钥运行单个fetch请求。或者您需要有两个提取请求,分别执行,然后合并这两个结果集。

检查如下实体:

[NSPredicate predicateWithFormat:@"self.entity = %@", Person.entity];

Swift 4.0根据malhal的建议,使用NSManagedObject的实体属性检查实体类型的方法

let entityDescription = NSEntityDescription.entity(forEntityName: "Account", in: managedObjectContext)!
return NSPredicate(format: "entity = %@", entityDescription)

我希望entity.name能解决一些问题。。。这是模型中保存的数据(使用应用程序编译)和SQLite文件中保存的数据之间的差异……mahal下面的建议非常有效。斯图尔特·帕蒂森的Swift版本也是如此。在从父抽象实体获取值时,我使用它排除特定的子实体。这很有效!当从格式为“entity%@”的父抽象实体获取值时,我使用它来排除特定的子实体