Datos básicos: Obtenga el resultado de múltiples entidades o relación

Tengo dos entidades Entidad del Employee

 @interface Employee : NSManagedObject @property (nonatomic, retain) NSString * dept; @property (nonatomic, retain) NSString * email; @property (nonatomic, retain) NSString * name; @property (nonatomic, retain) Department *deptEmp; @end 

y entidad Department

 @interface Department : NSManagedObject @property (nonatomic, retain) NSString * location; @property (nonatomic, retain) NSString * name; @property (nonatomic, retain) Employee *deptEmp1; 

Estoy tratando de get información de ambos con el siguiente pnetworkingicado

 NSMutableString *queryString = [NSMutableString stringWithFormat:@"(name = 'Apple') AND (deptEmp1.location like 'Cupertino')"]; NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Employee" inManagedObjectContext:self.managedObjectContext]; 

Y la request de búsqueda es

 NSFetchRequest *request = [[NSFetchRequest alloc] init]; [request setEntity:entityDescription]; [request setResultType:NSDictionaryResultType]; // NSFetchRequestResultType - NSDictionaryResultType [request setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObjects:@"Department",nil]]; [request setIncludesSubentities:YES]; 

Establecer pnetworkingicado

 if(![queryString isEqualToString:@""]) { [request setPnetworkingicate:[NSPnetworkingicate pnetworkingicateWithFormat:queryString]]; } NSError *error = nil; NSArray *returnArray = nil; 

Obteniendo Resultado

 @synchronized(self) { returnArray = [self.managedObjectContext executeFetchRequest:request error:&error]; } 

Pero aquí nunca obtengo resultados.

No estoy seguro de lo que desea lograr, pero si desea recuperar un Employee que trabaja en un nombre de departamento específico y en una location específica, usaré el siguiente código:

 NSMutableString *queryString = [NSMutableString stringWithFormat:@"deptEmp1.name == %@ AND deptEmp1.location == %@", @"Apple", @"Cupertino"]; NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Employee" inManagedObjectContext:self.managedObjectContext]; NSFetchRequest *request = [[NSFetchRequest alloc] init]; [request setEntity:entityDescription]; [request setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObjects:@"Department",nil]]; [request setIncludesSubentities:YES]; NSArray* returnArray = [self.managedObjectContext executeFetchRequest:request error:&error]; if([returnArray count] > 0) { Employee* emp = [returnArray objectAtIndex:0]; NSLog(@"%@ %@ %@", emp.name, emp.dept, emp.deptEmp.location); } 

Pocas notas

¿Por qué usas un candado en la request? ¿Has establecido una rel inversa? ¿Tal vez necesita configurar una relación de uno a varios entre el Department y el Employee ?

Inténtalo y avísame.

Editar

Prueba esta. No noté la cadena de consulta en su pregunta.

 NSPnetworkingicate *pnetworkingicate = [NSPnetworkingicate pnetworkingicateWithFormat:@"deptEmp1.name == %@ AND deptEmp1.location == %@", @"Apple", @"Cupertino"]; NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Employee" inManagedObjectContext:self.managedObjectContext]; NSFetchRequest *request = [[NSFetchRequest alloc] init]; [request setEntity:entityDescription]; [request setPnetworkingicate:pnetworkingicate]; [request setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObjects:@"Department",nil]]; [request setIncludesSubentities:YES]; NSArray* returnArray = [self.managedObjectContext executeFetchRequest:request error:&error]; if([returnArray count] > 0) { Employee* emp = [returnArray objectAtIndex:0]; NSLog(@"%@ %@ %@", emp.name, emp.dept, emp.deptEmp.location); } 

Editar 2

 NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Employee" inManagedObjectContext:self.managedObjectContext]; NSFetchRequest *request = [[NSFetchRequest alloc] init]; [request setEntity:entityDescription]; [request setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObjects:@"Department",nil]]; NSArray* returnArray = [self.managedObjectContext executeFetchRequest:request error:&error]; for(Employee* emp in returnArray) { NSLog(@"%@", emp); NSLog(@"%@", emp.deptEmp); } 

Necesita establecer una relación inversa. El object del departamento debe verse así:

 @interface Department : NSManagedObject @property (nonatomic, retain) NSString * location; @property (nonatomic, retain) NSString * name; @property (nonatomic, retain) NSSet *deptEmp1; 

Al igual que todo Departamento tiene una colección de empleados y un empleado trabajan en un departamento.

Y en su pnetworkingicado, debe ajustar "deptEmp1.name" a "deptEmp.name"