2011-03-03 17 views
12

¿Alguien podría decirme qué pasa con este código? Se plantea la siguiente aplicación de error y la causa de accidente:Datos principales: Error de Keypath no encontrado en la entidad <NSSQLEntity Studies id = 3>

reason: 'keypath Studies.patients.PatientName not found in entity <NSSQLEntity Studies id=3>' 

Código:

- (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]; 

    } 

Respuesta

15

En primer lugar, como su entidad fetch es Studies, no la incluye en el predicado porque los objetos Studies son los que reciben la prueba de predicado en primer lugar. Por lo que su predicado debe ser al menos simplemente:

patients.PatientName == %@ 

Sin embargo, por convención, patients indicaría una relación a varios. Si es así, eso significa que el valor real de patients es un conjunto de (presumiblemente) Patient objetos. Como tal, no puede solicitar un conjunto para un valor de atributo como el anterior: en su lugar, debe solicitar un nuevo conjunto de todos los objetos del conjunto que coinciden con el predicado. Utilice el operador de cualquiera o todos de esta manera:

ALL patients.PatientName == %@ 

Yo añadiría que, por convención, todos los nombres de los atributos y las relaciones comienzan con las letras minúsculas por lo que si PatientName es un atributo que debe ser patientName.

+0

pero no funciona la cláusula All – Ali

+0

Parece que necesitas CUALQUIER entonces. Parece que busca "cualquier Estudio en el que CUALQUIER paciente.patientName sea igual a la variable". En ese caso, el ALL no sería apropiado. El todo solo funcionaría si todos los pacientes.patientName tuvieran el mismo nombre. – TechZen

5

sea de la entidad Estudios no tiene una propiedad del paciente, o la entidad que los puntos pacientes relación a no tiene Propiedad PatientName (preste atención a los problemas de mayúsculas/minúsculas) o ambos.

+0

+1 Sí, el caso de relación puede dar este error. Gracias :) –

Cuestiones relacionadas