Could any one tell me what's the wrong with this code? It raises the following error and cause application to crash:
reason: 'keypath Studies.patients.PatientName not found in entity <NSSQLEntity Studies id=3>'
Code:
- (void)viewDidLoad {
[super viewDidLoad];
test_coredataAppDelegate *appDelegate = (test_coredataAppDelegate *)[[UIApplication sharedApplication] delegate];
self.context = appDelegate.managedObjectContext;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"Studies" inManagedObjectContext:_context];
[fetchRequest setEntity:entity];
/**/
NSLog(patientName);
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:
@"(Studies.patients.PatientName == %@ )",patientName]];
NSError *error;
self.StudiessList = [_context executeFetchRequest:fetchRequest error:&error];
self.title = @"patients";
[fetchRequest release];
}
Firstly, since your fetch entity is Studies
you don't include it in the predicate because the Studies
objects are the ones receiving the predicate test in the first place. So your predicate should be at least just:
patients.PatientName == %@
However, by convention, patients
would indicate a to-many relationship. If so, that means that the actual value of patients
is a set of (presumably) Patient
objects. As such you can't ask a set for an attribute value as above: Instead you have to ask for a new set of all object in the set that match the predicate. Use the ANY or All operator like so:
ALL patients.PatientName == %@
I would add that by convention all attribute and relationship names start with lower case letters so if PatientName
is an attribute it should be patientName
.