NSPredicate不使用核心数据中的抽象实体属性

时间:2013-06-22 22:21:09

标签: ios objective-c core-data nspredicate

我有一个核心数据类SSSLicense,它具有名称和类型等属性。它继承自一个名为SSSArchivableEntity的抽象实体,它有一个名为isArchived(以及其他)的布尔属性。

我已经从数据库中获取了一整套许可证实体,现在我正在尝试根据类型和isArchived标志进行过滤。但是,尽管我的谓词有很多变化,但我无法得到有效的结果。

以下是相关代码:

    NSSet *licenses = [person licenseList] ;

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(licenseType like %@) AND (isArchived == NO)",
                           lType];
NSSet *filteredLicenses = [licenses filteredSetUsingPredicate:predicate];

如果我将谓词更改为使用SSSLicense的另一个属性,例如name(而不是isArchived),则谓词可以正常工作。我甚至为SSSLicense添加了一个简单的布尔属性,并成功使用它进行过滤。

似乎它与isArchived是抽象实体的属性这一事实有关。有什么特别的东西可以用过滤继承属性吗?

谢谢!

3 个答案:

答案 0 :(得分:0)

也许硬编码值不起作用。我建议使用标准语法:

[NSPredicate predicateWithFormat:
    @"(licenseType like %@) && (isArchived = %@)", lType, @(NO)];

如果这不起作用,我会通过Firefox中的isArchived命令行工具或SQLite Manager插件手动检查sqlite3属性的值。也许你期待那里没有持久的价值。

如果所有这些都经过验证,可能是您正在读取错误的值或显示错误的值,尽管谓词实际上有效。

答案 1 :(得分:0)

我宁愿选择更好的而不是格式,因此我会尝试这样的事情:

[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
    return ([[evaluatedObject licenseType] rangeOfString:lType].location == NSNotFound && [[evaluatedObject isArchived] boolValue] == NO);
}];

答案 2 :(得分:0)

问题结果是谓词如何通过if语句测试条件与直接测试之间的关系。我的种子数据通过直接的setter调用创建了许可证,而我没有明确地将isArchived设置为NO。在应用程序中,当创建许可证时,它正在设置中。因此,种子数据无法通过谓词返回。但是,如果我手动循环设置并通过“[license isArchived] == NO”进行测试,则种子数据和应用程序数据都按预期返回。

我的猜测是直接布尔测试检查有效的'YES',如果不是,则假设为NO,而谓词明确检查YES = 1 NO = 0(或者表示它)。