假设Manager
与Employee
个对象存在多对多的关系。给定对Manager
对象的引用(即NSManagedObject *manager
),如何引用“工资超过10000的所有工资中薪水最低的Employee
?” p>
我可以想到两种可能的方法:
方法1:构建NSFetchRequest
并使用相关Manager
的对象ID指定所需的Manager
。
方法2:Manager
上的某种键值编码表达式,例如[manager valueForKeyPath:@"..."]
(有些使用NSPredicate
?)
如果有合理的解决方案,我倾向于方法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];