2012-10-03 21 views
5

Tengo dos entidades. Employee entidadDatos principales: Resultado de obtención de múltiples entidades o relación

@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 Department entidad

@interface Department : NSManagedObject 

@property (nonatomic, retain) NSString * location; 
@property (nonatomic, retain) NSString * name; 
@property (nonatomic, retain) Employee *deptEmp1; 

Estoy tratando de recabar información de los dos con siguiente predicado

NSMutableString *queryString = [NSMutableString stringWithFormat:@"(name = 'Apple') AND (deptEmp1.location like 'Cupertino')"]; 

NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Employee" inManagedObjectContext:self.managedObjectContext]; 

Y petición de recuperación es

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

Configuración predicado

if(![queryString isEqualToString:@""]) 
{ 
     [request setPredicate:[NSPredicate predicateWithFormat:queryString]]; 
} 

NSError *error = nil; 
NSArray *returnArray = nil; 

Resultado Obtención

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

Pero aquí nunca consigo resultado.

+0

Podría explicar lo que quiere recuperar? Gracias. –

+0

Quiero buscar el nombre, el departamento de la primera entidad y la ubicación desde el segundo con la condición del predicado. – kamleshwar

Respuesta

3

no estoy seguro de lo que quiere lograr, pero si desea recuperar un Employee que trabaja en nombre de un departamento específico y en un lugar específico, voy a usar un 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é utilizas un candado en la solicitud? ¿Ha establecido un rel reverso? ¿Quizás necesite configurar un REL uno a muchos entre Department y Employee?

Inténtalo y házmelo saber.

Editar

prueba este. No noté la cadena de consulta en su pregunta.

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"deptEmp1.name == %@ AND deptEmp1.location == %@", @"Apple", @"Cupertino"]; 
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Employee" inManagedObjectContext:self.managedObjectContext]; 

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
[request setEntity:entityDescription]; 
[request setPredicate:predicate]; 
[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); 
} 
+0

Gracias por su respuesta, en la cadena de consulta he cambiado deptEmp1 a deptEmp y la configuración según su Nota, Se ejecuta sin ningún error. pero no devuelvo nada, incluso tengo registros para el mismo en DB. – kamleshwar

+1

@kamleshwar He añadido una edición. Intentalo. –

+1

Lo siento, querido, pero esto no funciona. ¿No hay ningún código de muestra que pueda seguir ?, como lo intenté desde hace 2-3 días, no encontré ninguna solución. No estoy seguro de si el problema está en el código o el modelo. Gracias por su ayuda – kamleshwar

0

Tiene que establecer una relación inversa. Su objeto Departamento necesita para parecerse a lo siguiente:

@interface Department : NSManagedObject 

@property (nonatomic, retain) NSString * location; 
@property (nonatomic, retain) NSString * name; 
@property (nonatomic, retain) NSSet *deptEmp1; 

Al igual que todos los departamentos tiene una colección de los empleados y una obra Empleado en una de departamentos.

Y en su predicado es necesario ajustar "deptEmp1.name" a "deptEmp.name"

Cuestiones relacionadas