NSPredicate 不起作用?

Posted

技术标签:

【中文标题】NSPredicate 不起作用?【英文标题】:NSPredicate won't work? 【发布时间】:2013-08-17 21:19:25 【问题描述】:

我有 2 个实体之间的一对多关系。运动员(评估)>评估(whosEval)。我试图只显示被选中的运动员的评价。但是,当我尝试通过 eval.whosEval 访问关系时,我得到一个未定义的错误。当我运行应用程序时,表是空的,而如果我注释掉谓词,它会显示所有运动员的所有评估。我错过了什么吗?谢谢。

allEvals.m

    -(void)viewWillAppear:(BOOL)animated

    self.title = [NSString stringWithFormat:@"%@'s Evaluations",_athletesFullName];

    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;
    NSArray *results = [_managedObjectContext executeFetchRequest:athleteRequest error:&athleteError];
    NSPredicate *athletePredicate = [NSPredicate predicateWithFormat:@"full == %@", _athletesFullName];
    [request setPredicate:athletePredicate];
    Athlete *currentAthlete = [results objectAtIndex:0];

   NSPredicate *predicate = [NSPredicate predicateWithFormat:@"whosEval == %@", currentAthlete];
   [request setPredicate:predicate];
    NSEntityDescription *eval = [NSEntityDescription entityForName:@"Eval" inManagedObjectContext:_managedObjectContext];
    [request setEntity:eval];



    NSSortDescriptor *sortDescriptor =
    [[NSSortDescriptor alloc] initWithKey:@"date_recorded"
                                ascending:NO
                                 selector:@selector(localizedCaseInsensitiveCompare:)];
    NSArray *sortDescriptors = [[NSArray alloc]initWithObjects:sortDescriptor, nil];
    [request setSortDescriptors:sortDescriptors];

    NSError *error = nil;
    NSMutableArray *mutableFetchResults = [[_managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
    if (mutableFetchResults == nil)
        //handle error
    

    [self setEvalArray:mutableFetchResults];
    [self.tableView reloadData];

    NSLog(@"Athlete's Full Name is: %@",_athletesFullName);


【问题讨论】:

【参考方案1】:

您的谓词在应该真正使用运动员对象时使用运动员名称:

@"whosEval == %@", self.athlete

【讨论】:

我是 99.9% 这就是错误。我目前使用的是字符串,但是当我设置关系时,我确实使用了运动员对象。但是,当以相同的方法访问运动员对象时,我可以共享我用于评估的 managedObjectContext 吗? 你所有的对象都必须在同一个上下文中(所以是的)。 更新了代码,现在我得到了结果,但不是每个运动员的相关评估,只是所有评估。 打印运动员的评估(使用关系) - 与表格内容相比,您会得到什么。 我没有为运动员(evals)设置任何东西,只是 evals(whosEval)。我以为你只需要设置一侧?我什至不知道我会如何设置它?我将如何选择评估?【参考方案2】:

你打电话

NSLog(@"This eval is for: %@", eval.whosEval);

但是您将eval 声明为:

NSEntityDescription *eval = ...

所以NSEntityDescription 类不可能知道“whosEval”是什么。

mutableFetchResults 中检索Eval 对象的实际实例并在其上调用whosEval

if (mutableFetchResults == nil)
    //handle error
 else 

    [self setEvalArray:mutableFetchResults];
    [self.tableView reloadData];

    NSLog(@"Athlete's Full Name is: %@",_athletesFullName);
    NSLog(@"This eval is for: %@", [[mutableFetchResults lastObject] whosEval]);

【讨论】:

在“id”类型的对象上找不到属性 whosEval 试试看:NSLog(@"This eval is for: %@", [[mutableFetchResults lastObject] whosEval]);另外检查 Wain 写的内容,因为看起来你的代码有更多问题......

以上是关于NSPredicate 不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

核心数据 NSPredicate 不起作用[重复]

带有 SUBQUERY 的 NSPredicate 不起作用

NSPredicate 不起作用?

CoreData 获取请求 NSPredicate 不起作用

如果搜索字符串包含左“(”和右“)”括号,NSPredicate 不起作用

Swift 4 NSPredicate 日期格式不起作用