Josue Espinosa
Josue Espinosa

Reputation: 5089

NSPredicate won't work?

I have a to-many relationship between 2 entities. Athlete(evals)<-->>Eval(whosEval). I am trying to display only the evals of the athlete who was selected. However, when I try to access the relationship through eval.whosEval, I get an undefined error. When I run the app, the table is empty, whereas if I comment out the predicate, it displays ALL Evals for ALL the Athletes. Am I missing something? Thank you.

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);

}

Upvotes: 0

Views: 71

Answers (2)

deekay
deekay

Reputation: 929

You call

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

But you declared eval as:

NSEntityDescription *eval = ...

So there is no way that class NSEntityDescription know what "whosEval" is.

Retrieve actual instance of Eval object from the mutableFetchResults and invoke whosEval on it:

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]);
}

Upvotes: 1

Wain
Wain

Reputation: 119041

Your predicate uses the athlete name when it should really use the athlete object:

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

Upvotes: 1

Related Questions