NSPredicate 按属性过滤核心数据关系 NSSet

Posted

技术标签:

【中文标题】NSPredicate 按属性过滤核心数据关系 NSSet【英文标题】:NSPredicate to filter Core Data Relationship NSSet by attribute 【发布时间】:2017-04-14 20:35:42 【问题描述】:

我与两个实体有many-to-many 关系。一个是Person,另一个是Clubs。我希望能够编写一个predicate 来查找特定Club 中的所有Person 实体。我还想检查那个人的position 属性。

以下是不起作用的:

NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Person" inManagedObjectContext:self.managedObjectContext]];
[request setPredicate:[NSPredicate predicateWithFormat:@"position CONTAINS[cd] %@ AND IN %@", @"manager", self.clubs.people]];
NSArray *results = [self.managedObjectContext executeFetchRequest:request error:nil];

这会因错误而崩溃:

由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'无法解析格式 string "title CONTAINS[cd] %@ AND IN %@"'

我知道我在这里做错了,有什么帮助吗?

【问题讨论】:

尝试使用 SELF 来引用 Person 对象本身,而不是属性:[NSPredicate predicateWithFormat:@"position CONTAINS[cd] %@ AND SELF IN %@", @"manager", self.clubs.people] 【参考方案1】:

正如上面@pbasdf 所指出的,您应该使用 self.但是,首先使用 self 子句的查询效率会更高,即

[NSPredicate predicateWithFormat:@"SELF IN %@ AND position CONTAINS[cd] %@", self.clubs.people, @"manager"];

【讨论】:

以上是关于NSPredicate 按属性过滤核心数据关系 NSSet的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSPredicate 过滤核心属性和实体

核心数据:过滤多对可能与 NSPredicate 的关系

采用核心数据,按多个标准过滤。我想要 NSPredicate 吗?

在一对多关系中使用 NSPredicate 进行过滤

如何按不相关的实体过滤核心数据

NSPredicate 过滤关系