2

假设 a与对象Manager具有一对多关系。Employee给定一个Manager对象的引用(即NSManagedObject *manager),我如何获得对“Employee所有工资超过 10000 的人中工资最低的”的引用?

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

方法 1:构造一个NSFetchRequest并用所讨论的对象 ID 指定Manager想要的Manager

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

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

4

2 回答 2

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 个对象。

As always, performance issues are usually highly dependent on your model layout, and the options used for specifying the model and its relationships.

于 2012-05-22T21:26:48.370 回答
1

您可以过滤一系列Employee关系以获得您想要的关系。1)首先,获得所有Employee工资超过10000的:

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];
于 2012-05-22T04:53:26.260 回答