NSPredicate 与 AND 在一对多关系中

Posted

技术标签:

【中文标题】NSPredicate 与 AND 在一对多关系中【英文标题】:NSPredicate with AND in one-to-many relationships 【发布时间】:2012-10-27 00:48:49 【问题描述】:

我是 NSPredicate 的新手,所以如果有人能告诉我我的方法是否正确,我将不胜感激.. 问题:(这些类是 NSManagedObject 的子类) 我有一个带有这个字段的Player Class

@property (nonatomic, retain) NSSet *hisNumbers; //it's a set of Numbers

Numbers 类是这样的:

@property (nonatomic, retain) NSNumber * first;
@property (nonatomic, retain) NSNumber * second;
@property (nonatomic, retain) Season *forSeason; //it's one-to-one relationship with a Season Object
@property (nonatomic, retain) Player *owner; //one-to-one with Player
@property (nonatomic, retain) NSNumber * isPresent;

Season Class 有以下参数:

@property (nonatomic, retain) NSSet *seasonGames; //set of Game
@property (nonatomic, retain) NSSet *numbers; //set of Numbers (inverse of forSeason)

我正在尝试做的是一种方法,它接受一个 season 对象并将那个赛季的所有球员归还给我... 这是我的尝试:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Player" inManagedObjectContext:context];
NSFetchRequest *request = [[NSFetchRequest alloc]init];
[request setEntity:entity];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"nameLast" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(ANY SELF.hisNumbers.isPresent == %@) AND (ANY SELF.hisNumbers IN %@)",[NSNumber numberWithBool:YES],season.numbers];

但它不起作用..查询的两个部分似乎是分开工作的,但也许只是巧合......

现在它返回每个玩家的号码带有标志“isPresent == YES”和另一个号码是“season.numbers”的成员。相反,我需要的是拥有一个同时符合两个标准的“数字”的玩家......

如果您需要更多详细信息,请告诉我。谢谢大家

【问题讨论】:

究竟是什么不起作用?你期待什么,你看到了什么?我刚刚尝试过,它似乎对我有用。不过我没有创建类,我只是使用了 NSManagedObject。 正如 Martin R 所说,它返回每个玩家的号码带有标志“isPresent == YES”和另一个号码是“season.numbers”成员的号码。相反,我需要的是拥有一个同时符合两个标准的“数字”的球员......我希望现在它更清楚了。 为什么我的问题是-1?因为我不知道答案? +1 好问题解决一个微妙的问题 【参考方案1】:

对于一个号码为isPresent == YES 和一个可能不同号码的玩家是正确的,该号码是season.numbers 的成员。

要找到(至少一个)号码符合这两个条件的玩家,您可能必须使用 SUBQUERY(至少我不知道更简单的解决方案)。

你也可以简化

"hisNumbers IN %@", season.numbers

"hisNumbers.forSeason == %@", season

这给出了以下谓词,希望对你有用:

[NSPredicate predicateWithFormat:@"SUBQUERY(hisNumbers, $x, $x.isPresent == %@ AND $x.forSeason == %@).@count > 0",
     [NSNumber numberWithBool:YES], season]

(请参阅“NSExpression 类参考”中的expressionForSubquery:usingIteratorVariable:predicate:,其中记录了类似的问题和 SUBQUERY 解决方案)。

【讨论】:

它似乎真的有效......谢谢!让我在接受您的答案之前再做一些测试...哦,谢谢您的链接...昨天我寻找解释子查询的东西,但收效甚微... +1 这是 SUBQUERY 是正确使用的少数情况之一。

以上是关于NSPredicate 与 AND 在一对多关系中的主要内容,如果未能解决你的问题,请参考以下文章

NSPredicate:“添加”一对多关系CoreData中所有实体的属性值

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

CoreData:使用 NSPredicate 过滤一对多对多关系(此处不允许错误对多键)

NSPredicate 与关系

核心数据:NSPredicate 一对多对多关系

iOS:“@count == 0”的 NSPredicate 用于一对一和一对多关系