2012-10-03 16 views
5

Ho due entità. Employee entitàDati principali: recupera risultato da più entità o relazione

@interface Employee : NSManagedObject 

@property (nonatomic, retain) NSString * dept; 
@property (nonatomic, retain) NSString * email; 
@property (nonatomic, retain) NSString * name; 
@property (nonatomic, retain) Department *deptEmp; 

@end 

e Department entità

@interface Department : NSManagedObject 

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

sto cercando di recuperare informazioni da entrambi con seguente predicato

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

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

E Fetch richiesta viene

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

Impostazione predicato

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

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

Risultato Recupero

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

Ma qui non ho mai ottenere risultato.

+0

Ci può spiegare che cosa si vuole recuperare? Grazie. –

+0

Voglio recuperare nome, reparto dalla prima entità e posizione dalla seconda alla condizione Predicato. – kamleshwar

risposta

3

io non sono sicuro di quello che si vuole raggiungere, ma se si vuole recuperare un Employee che lavora in un nome specifico reparto e in una posizione specifica, userò un il seguente codice:

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

Poche note

Perché si utilizza un blocco sulla richiesta? Hai impostato un rel inverso? Forse è necessario impostare un rel one-to-many tra Department e Employee?

Provalo e fammi sapere.

Modifica

provare questo. Non ho notato la stringa di query nella tua domanda.

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

Edit 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

Grazie per la tua risposta, Nella stringa di query ho cambiato deptEmp1 in deptEmp e le impostazioni secondo la tua nota, funziona senza errori. ma non restituire nulla, anche io ho i record per lo stesso in DB. – kamleshwar

+1

@kamleshwar Ho aggiunto una modifica. Provalo. –

+1

Scusa, caro ma questo non funziona. Non c'è alcun codice di esempio che posso seguire ?, come ho provato da 2-3 giorni non ho trovato alcuna soluzione. Non sono sicuro che il problema sia nel codice o nel modello. Grazie per il vostro aiuto – kamleshwar

0

È necessario impostare una relazione inversa. vostro Dipartimento bisogno di guardare in quel modo:

@interface Department : NSManagedObject 

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

così tutto Departement ha una collezione di dipendenti e di un lavoro dipendente a un Dipartimento.

E sul predicato è necessario regolare "deptEmp1.name" a "deptEmp.name"

Problemi correlati