评估谓词中的核心数据实体类型

时间:2013-05-03 14:48:46

标签: core-data nspredicate nsfetchrequest

我有一个块谓词,我精心设计,发现你无法在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;
    }];

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

检查这样的实体:

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

答案 2 :(得分:0)

按照Malhal的建议,使用NSManagedObject的entity属性检查实体类型的Swift 4.0方法。

var date = new Date;
return (<p>date.toLacaleString()</p>)