【发布时间】:2013-06-22 22:21:09
【问题描述】:
我有一个核心数据类 SSSLicense,它具有名称和类型等属性。它继承自一个名为 SSSArchivableEntity 的抽象实体,该实体具有一个名为 isArchived 的布尔属性(等等)。
我已经从数据库中获取了完整的许可证实体集,现在正尝试根据类型和 isArchived 标志进行过滤。但是,尽管我的谓词有很多变体,但我无法得到有效的结果。
以下是相关代码:
NSSet *licenses = [person licenseList] ;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(licenseType like %@) AND (isArchived == NO)",
lType];
NSSet *filteredLicenses = [licenses filteredSetUsingPredicate:predicate];
如果我更改我的谓词以使用 SSSLicense 的另一个属性,例如名称(而不是 isArchived),则谓词有效。我什至在 SSSLicense 中添加了一个简单的布尔属性并成功使用它进行过滤。
这似乎与 isArchived 是抽象实体的属性这一事实有关。我需要做一些特别的事情来过滤继承的属性吗?
谢谢!
【问题讨论】:
-
尝试重命名属性。某些属性名称与 NSManagedObject 的内置属性冲突。
-
谢谢,但这没有用。我将属性名称更改为“fred”,但仍然得到相同的结果(没有匹配的对象)。
-
NSPredicate不是NSString,您需要了解更多关于如何使用%K和%@格式说明符作为谓词,或者您可以创建一个谓词使用更舒适的积木。 -
我尝试了许多变体,包括 %K 与直接字符串。我给出了上面的示例代码,因为它是最容易解释的。如果属性是具体实体的一部分,Apple 的示例代码显示两者都可以正常工作。只有当我测试的属性在抽象实体中时它才会失败。
-
我有一个类似的问题,但在抽象基础实体中有一个字符串属性。不知道为什么谓词会过滤掉所有内容。
标签: ios objective-c core-data nspredicate