我正在使用Core Data并与以下实体建立了多对多关系:
Athlete(evals)<-->>Eval(whosEval)
它以表格视图开始,列出数据库中的所有运动员。然后当你选择一名运动员时,它会在桌面视图中拉出他们的Evals。问题是我这样做是通过检查他们的全名。不幸的是,2名运动员可能拥有相同的名字。出于这个原因,我也检查了他们的父母的名字,但我认为我做错了。任何人都可以解释为什么以下不起作用以及我应该如何正确地做到这一点?这个代码会发生什么,如果2个运动员有相同的名字,他们会分享结果。即使他们的父母姓名不同。
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
_managedObjectContext = [appDelegate managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSFetchRequest *athleteRequest = [[NSFetchRequest alloc] init];
[athleteRequest setEntity:[NSEntityDescription entityForName:@"Athlete" inManagedObjectContext:_managedObjectContext]];
NSError *athleteError = nil;
NSPredicate *athletePredicate = [NSPredicate predicateWithFormat:@"full == %@", _athletesFullName];
[athleteRequest setPredicate:athletePredicate];
NSArray *results = [_managedObjectContext executeFetchRequest:athleteRequest error:&athleteError];
if([results count] >1){
NSPredicate *athletePredicate = [NSPredicate predicateWithFormat:@"pfull == %@", _athletesParentsFullName];
[athleteRequest setPredicate:athletePredicate];
}
Athlete *athleteSelected;
if([results count] >0){
Athlete *currentAthlete = [results objectAtIndex:0];
athleteSelected = currentAthlete;
}
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"whosEval == %@", athleteSelected];
[request setPredicate:predicate];
NSEntityDescription *eval = [NSEntityDescription entityForName:@"Eval" inManagedObjectContext:_managedObjectContext];
[request setEntity:eval];
答案 0 :(得分:0)
执行请求后修改athleteRequest
没有
对结果有任何影响。为什么不简单
NSPredicate *athletePredicate = [NSPredicate predicateWithFormat:@"full == %@ AND (pfull == nil OR pfull == %@)",
_athletesFullName, _athletesParentsFullName];
除此之外,一些人识别对象可能更好 唯一标识符(例如唯一的运动员号码)而不是依赖于名称 和父母的名字。
答案 1 :(得分:0)
您的场景非常简单,但对于更复杂的情况,您可以使用复合谓词。
阅读NSHipster的这篇精彩文章,了解更多信息: http://nshipster.com/nspredicate/