mar*_*eli 2 core-data objective-c subquery nspredicate ios
我是NSPredicate的新手所以如果有人会告诉我我是否正确的方式我会很感激..
问题:(类是NSManagedObject的子类)
我有一个这个字段的Player类:
@property (nonatomic, retain) NSSet *hisNumbers; //it's a set of Numbers
Run Code Online (Sandbox Code Playgroud)
该数字类是这样的:
@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;
Run Code Online (Sandbox Code Playgroud)
本赛季类已经得到了这些参数:
@property (nonatomic, retain) NSSet *seasonGames; //set of Game
@property (nonatomic, retain) NSSet *numbers; //set of Numbers (inverse of forSeason)
Run Code Online (Sandbox Code Playgroud)
我正在尝试做的是一种方法,它需要一个赛季对象并让我回到那个赛季的所有球员......
这是我的尝试:
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];
Run Code Online (Sandbox Code Playgroud)
但它不起作用..查询的两个部分似乎分开工作,但也许这只是一个巧合......
现在它返回每个拥有标记'isPresent == YES'的数字的玩家和另一个拥有'season.numbers'成员的数字.相反,我需要的是那些拥有一个同时匹配两个标准的"数字"的玩家......
如果您需要更多详细信息,请告诉我..谢谢大家
你的谓词适用于一个拥有数字isPresent == YES且可能不同的数字的玩家season.numbers.
要找到具有(至少一个)符合两个标准的号码的玩家,您可能必须使用SUBQUERY(至少我不知道更简单的解决方案).
你也可以简化
"hisNumbers IN %@", season.numbers
Run Code Online (Sandbox Code Playgroud)
至
"hisNumbers.forSeason == %@", season
Run Code Online (Sandbox Code Playgroud)
这给出了以下谓词,希望对你有用:
[NSPredicate predicateWithFormat:@"SUBQUERY(hisNumbers, $x, $x.isPresent == %@ AND $x.forSeason == %@).@count > 0",
[NSNumber numberWithBool:YES], season]
Run Code Online (Sandbox Code Playgroud)
(请参阅expressionForSubquery:usingIteratorVariable:predicate:在"NSExpression类参考"中,其中记录了类似的问题和SUBQUERY解决方案).
| 归档时间: |
|
| 查看次数: |
577 次 |
| 最近记录: |