过滤NSManagedObject的关系

时间:2012-05-21 10:01:51

标签: core-data nspredicate relationship nsmanagedobject

假设ManagerEmployee个对象存在多对多的关系。给定对Manager对象的引用(即NSManagedObject *manager),如何引用“工资超过10000的所有工资中薪水最低的Employee?” p>

我可以想到两种可能的方法:

方法1:构建NSFetchRequest并使用相关Manager的对象ID指定所需的Manager

方法2:Manager上的某种键值编码表达式,例如[manager valueForKeyPath:@"..."](有些使用NSPredicate?)

如果有合理的解决方案,我倾向于方法2。请赐教。

2 个答案:

答案 0 :(得分:3)

当然,您可以将谓词和排序描述符应用于关系返回的集合。如果集合相对较小(因为它在内存中完成,所有对象都必须被提取),所以很容易,而且很快。您可能希望预先执行批量提取以限制执行I / O的次数。

根据数据库的大小和管理员(以及索引)下的员工数量,您可能希望在数据库级别完成所有操作...

// We want "Employee" objects
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Employee"];
// Assuming the "inverse" relationship from employee-to-manager is "manager"...
// We want all employees that have "our" manager, and a salary > 10000
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"(manager == %@) AND (salary > 10000", manager];
// Sort all the matches by salary, little-to-big
fetchRequest.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"salary" ascending:YES]];
// Limit the returned set to 1 object, which will be the smallest
fetchRequest.fetchLimit = 1;

这将在数据库级别执行整个查询,并且只返回1个对象。

与往常一样,性能问题通常高度依赖于您的模型布局,以及用于指定模型及其关系的选项。

答案 1 :(得分:1)

您可以过滤Employee关系数组,以获得所需的关系。  1)首先,获得薪水超过10000的所有Employee

NSArray *filtered = [manager.employees filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(salary > 10000)"]];

2)然后按降序排序

NSSortDescriptor* sortOrder = [NSSortDescriptor sortDescriptorWithKey: @"salary" ascending: NO];
NSArray *sortedAndFiltered =  [filtered sortedArrayUsingDescriptors: [NSArray arrayWithObject: sortOrder]];

3)然后让你的员工

[sortedAndFiltered lastObject];