2009-10-16 10 views
1

J'ai une hiérarchie de 3 objets qui a une racine comme 'Division' qui a beaucoup d'éléments 'Groupe' et chaque 'Groupe' a beaucoup de 'Employés'.Comment configurer un prédicat pour cette requête

Division [1] ------ [*] Groupe

Groupe [1] ------ [*] employé

Je voudrais savoir comment créer un NSPredicate pour rechercher tous les Employés de tous les Groupes d'une Division spécifique, triés par date/heure de création et sectionnés par leur 'Groupe' en utilisant l'objet 'Employé' comme entité de requête et connaissant l'identifiant de la Division spécifique.

Mais j'ai du mal à traduire cela en CoreData, donc toute suggestion serait utile.

je devais construire une requête SQL, ce serait quelque chose comme ceci:

select * from employé e où e.groupId dans (select * du groupe g où g.divisionId =: divisionId)

J'ai essayé, mais n'a pas fonctionné:

// Create the fetch request for the entity. 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 

    // Configure the request's entity and its predicate. 
    NSEntityDescription *entity = [NSEntityDescription 
entityForName:@"Employee" inManagedObjectContext:context]; 
    [fetchRequest setEntity:entity]; 

    // Create the predicate 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.groups IN %@", 
    [NSArray arrayWithArray:[[employee groups] allObjects]]]; 

    [fetchRequest setPredicate:predicate]; 

    // Edit the sort key as appropriate. 
    NSSortDescriptor *createDateSortDcptor = [[NSSortDescriptor alloc] 
initWithKey:@"createDateTime" ascending:YES]; 

    NSArray *sortDescriptors = [[NSArray alloc] 
initWithObjects:createDateSortDcptor, nil]; 

    [fetchRequest setSortDescriptors:sortDescriptors]; 

Mon objet hiérarchie est la suivante:

@interface Division : NSManagedObject 
{ 
} 

@property (nonatomic, retain) NSDate * createDateTime; 
@property (nonatomic, retain) NSSet* groups; 

@end 

@interface Group : NSManagedObject 
{ 
} 

@property (nonatomic, retain) NSDate * createDateTime; 
@property (nonatomic, retain) Division * division; 
@property (nonatomic, retain) NSSet* employees; 

@end 

@interface Employee : NSManagedObject 
{ 
} 

@property (nonatomic, retain) NSDate * createDateTime; 
@property (nonatomic, retain) NSSet* groups; 

@end 

Répondre

0

Il semble que vous voulez créer le prédicat comme

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY SELF.groups IN %@", 
                  [division groups]]; 

où la division est une instance de division. Cela va obtenir toutes les instances d'eployee qui ont une relation avec l'un des groupes de la division.

Votre code pour le tri des résultats semble correct.

Si vous prévoyez d'avoir beaucoup d'employés de ce type et que vous souhaitez récupérer le résultat par lots, votre approche à l'aide d'une requête de récupération est correcte. Si vous attendez un petit nombre d'employés, vous pouvez également les obtenir en utilisant le codage key-valye:

NSArray *divisionEmployees = [division valueForKeyPath:@"@unionOfSets.groups.employees"]; 
Questions connexes