我有一个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
答案 0 :(得分:0)
听起来你想创建像
这样的谓词NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY SELF.groups IN %@",
[division groups]];
其中division是Division实例。这将获得与任何部门组有关系的所有eployee实例。
您对结果进行排序的代码看起来是正确的。
如果您希望有许多此类员工,并且您希望批量获取结果,那么使用获取请求的方法是正确的。如果您期望少数员工,您也可以使用key-valye编码来获取它们:
NSArray *divisionEmployees = [division valueForKeyPath:@"@unionOfSets.groups.employees"];