在 NSFetchRequest 上设置 2 个 NSPredicates

Posted

技术标签:

【中文标题】在 NSFetchRequest 上设置 2 个 NSPredicates【英文标题】:Set 2 NSPredicates on a NSFetchRequest 【发布时间】:2013-08-18 20:54:18 【问题描述】:

我正在使用 Core Data 并与以下实体有一对多关系:

Athlete(evals)<-->>Eval(whosEval)

它以列出数据库中所有运动员的表格视图开始。然后,当您选择运动员时,它会在表格视图中拉出他们的评估。问题是我这样做的方式是通过检查他们的全名。不幸的是,有可能有 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];

【问题讨论】:

【参考方案1】:

在请求执行后修改athleteRequest没有 对结果的任何影响。为什么不简单

NSPredicate *athletePredicate = [NSPredicate predicateWithFormat:@"full == %@ AND (pfull == nil OR pfull == %@)",
             _athletesFullName, _athletesParentsFullName];

?

除此之外,通过一些人来识别对象可能会更好 唯一标识符(例如唯一的运动员编号)而不是依赖于姓名 和父母的名字。

【讨论】:

这就是发生的事情。当我有 2 名同名和不同父母姓名的运动员时,第一个很好,第二个运动员不显示另一个运动员的评价,但是每当我向该运动员添加评价时,它不会' t 显示在桌子上。 @user2674329:抱歉,我不明白。你的问题是关于如何使用 2 个标准来获取运动员,我试图回答这个问题。您还没有展示如何“向该运动员添加 eval”,所以我无法说明为什么它不能正常工作。 @user2674329:再提一句:您只需使用NSArray *evalsForAthlete = [athlete.evals allObjects] 即可获取运动员的评估,而无需执行另一个获取请求。 谢谢!!今年夏天开始ios编程,才16岁,OOP新手。非常感谢!【参考方案2】:

您的场景确实很简单,但对于更复杂的情况,您可以使用复合谓词。

阅读 NSHipster 的这篇精彩文章以获取更多信息: http://nshipster.com/nspredicate/

【讨论】:

以上是关于在 NSFetchRequest 上设置 2 个 NSPredicates的主要内容,如果未能解决你的问题,请参考以下文章

NSFetchRequest fetchBatchSize 不起作用

如何取消设置 NSFetchRequest 的 fetchLimit?

设置一对多关系后,NSFetchRequest 查询返回 nil

NSFetchResultsController w/ NSPredicate(关系)与基本 NSFetchRequest(包括图片)

调用返回多个集合时的 ​​NSFetchRequest

将 NSPredicate 设置为 NSFetchRequest 后 executeFetchRequest 崩溃