过滤掉子类结果的 NSPredicate

Posted

技术标签:

【中文标题】过滤掉子类结果的 NSPredicate【英文标题】:NSPredicate that filters out subclass results 【发布时间】:2013-05-19 15:33:17 【问题描述】:

我有两个班级,Company 和 MyCompany。 MyCompany 是 Company 的子类,Company 是 NSManagedObject 的子类。我正在尝试为 NSFetchRequest 编写一个谓词,该谓词将返回 Company 类的结果,但会过滤掉 MyCompany 对象。

我尝试了以下方法(建议从这里https://***.com/a/8065935/472344):

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"class != %@",NSStringFromClass([myCompany class])];

但我得到一个错误:

'keypath class not found in entity <NSSQLEntity CKCompany id=1>'

我也尝试过(从这里建议https://***.com/a/11693983/472344,我知道我真的不想要 SELF isKindOfClass,但我只是使用与答案中给出的完全相同的命令进行测试):

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self isKindOfClass: %@", [myCompany class];

并得到以下错误:

'Unknown/unsupported comparison predicate operator type'

如何编写谓词来实现我想要的?我支持 ios 5 及更高版本。

【问题讨论】:

所讨论的类不是 NSObject,因此它不会响应“class”或“className” Company 和 MyCompany 是 NSObject,因为它们继承自 NSManagedObject,但我现在意识到谓词已应用于 NSSQLEntity,因此我的情况与这些答案所响应的情况并不相同。但是我仍然需要解决我的问题。 【参考方案1】:

你可以设置

[fetchRequest setIncludesSubentities:NO];

以便获取请求仅返回与请求的实体类型完全相同的对象, 并且不包括子实体。

如果谓词用于核心数据获取请求,则(据我所知)不可能在谓词中引用对象类或实体名称。

【讨论】:

听起来它会起作用,感谢您提供的额外信息。我会试试这个。

以上是关于过滤掉子类结果的 NSPredicate的主要内容,如果未能解决你的问题,请参考以下文章

不存在是不是过滤掉了太多结果?

过滤掉Bing Web API v7中的非英语结果

Distinct() 在 Stream 上使用时似乎不会过滤掉相同的结果

使用 rails audited gem 根据已审核的更改过滤掉结果

如何使用窗口函数根据奇偶行号过滤掉结果,没有现有列作为行ID

过滤掉 jQuery 结果集中所有具有某个类的父级(在任何级别)的元素