Core data 筛选NSManagedObject的关系

Core data 筛选NSManagedObject的关系,core-data,nspredicate,relationship,nsmanagedobject,Core Data,Nspredicate,Relationship,Nsmanagedobject,假设一个经理与员工对象有一对多关系。给定对经理对象(即NSManagedObject*经理)的引用,如何获得对“工资超过10000的所有员工中工资最低的员工”的引用 我可以想出两种可能的方法: 方法1:构造一个NSFetchRequest,并使用所讨论的管理器的对象ID指定所需的管理器 方法2:Manager上的某种键值编码表达式,例如[Manager valueForKeyPath:@“…”](使用NSPredicate?) 如果有一个合理的解决方案,我倾向于方法2。请告诉我。您可以筛选您的员

假设一个
经理
员工
对象有一对多关系。给定对
经理
对象(即
NSManagedObject*经理
)的引用,如何获得对“工资超过10000的所有员工中工资最低的员工”的引用

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

方法1:构造一个
NSFetchRequest
,并使用所讨论的
管理器的对象ID指定所需的
管理器

方法2:
Manager
上的某种键值编码表达式,例如
[Manager valueForKeyPath:@“…”]
(使用
NSPredicate
?)


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

您可以筛选您的
员工关系数组,以获得您想要的关系。
1) 首先,获得所有工资超过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];

您可以筛选
员工关系数组,以获得所需关系。
1) 首先,获得所有工资超过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];

当然,您可以对关系返回的集合应用谓词和排序描述符。如果集合相对较小(因为它是在内存中完成的,所以必须提取所有对象),那么就很容易,也很快。您可能希望提前执行批处理提取,以限制执行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个对象


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

当然,您可以对关系返回的集合应用谓词和排序描述符。如果集合相对较小(因为它是在内存中完成的,所以必须提取所有对象),那么就很容易,也很快。您可能希望提前执行批处理提取,以限制执行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个对象

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