如何为此查询设置谓词

时间:2009-10-16 20:31:41

标签: iphone core-data

我有一个3对象层次结构,其根目录为'Division',其中包含许多'Group'项,每个'Group'都有许多'Employees'。

  

分部[1] ------ [*]分组

     

组[1] ------ [*]员工

我想知道如何创建NSPredicate以搜索特定部门的所有组的所有员工,按创建日期/时间排序,并使用'Employee'对象作为请求实体按其'Group'划分并且知道特定部门的ID。

但是我无法将其转换为CoreData,因此任何建议都会有所帮助。

我要构建一个SQL查询,它是这样的:

  

从员工e中选择*   egroupId in(select * from group g   其中g.divisionId =:divisionId)

我尝试了这个但是没有用:

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

我的对象层次结构是这样的:

@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

1 个答案:

答案 0 :(得分:0)

听起来你想创建像

这样的谓词
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY SELF.groups IN %@",
                                                          [division groups]];

其中division是Division实例。这将获得与任何部门组有关系的所有eployee实例。

您对结果进行排序的代码看起来是正确的。

如果您希望有许多此类员工,并且您希望批量获取结果,那么使用获取请求的方法是正确的。如果您期望少数员工,您也可以使用key-valye编码来获取它们:

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