5

我有一个我精心设计的块谓词,只是发现你不能在 Core Data 中使用它们。

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;
    }];

所以我需要将其转换为标准的字符串格式谓词,但我不清楚如何检查评估对象的实体类型。PersonAccount实体是实体的子类,实体Contact是在获取请求中评估的类型。我希望它会看到子类型。

4

3 回答 3

4

像这样检查实体:

[NSPredicate predicateWithFormat:@"self.entity = %@", Person.entity];
于 2018-03-17T00:22:43.233 回答
3

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

let entityDescription = NSEntityDescription.entity(forEntityName: "Account", in: managedObjectContext)!
return NSPredicate(format: "entity = %@", entityDescription)
于 2018-11-16T13:39:13.693 回答
2

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

"entity = %@"

之前:

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

根据您要执行的操作,您需要针对超级实体中已知的键运行单个提取请求。或者您需要有 2 个获取请求,分别执行,然后合并 2 个结果集。

于 2013-05-03T15:37:08.803 回答