2012-05-21 5 views
2

Предположим, что Manager имеет отношение ко многим со значениями Employee объектов. Учитывая ссылку на объект Manager (т. Е. NSManagedObject *manager), как мне получить ссылку на «Employee с наименьшей зарплатой среди всех тех, чья зарплата превышает 10000»?Фильтрация отношения объекта NSManagedObject

я могу думать о двух возможных подходов:

подхода 1: построения NSFetchRequest и указав Manager хотел с объектным идентификатором Manager в вопросе.

Подход 2: какое-то выражение кодирования значения ключа на Manager, например. [manager valueForKeyPath:@"..."] (с некоторым использованием NSPredicate?)

Я склонен к Подходу 2, если есть правдоподобное решение. Пожалуйста, просветите меня.

ответ

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]; 
3

Конечно, вы можете просто применить дескриптор предиката и сортировки к набору, возвращаемому этим отношением. Легко и довольно быстро, если набор относительно невелик (поскольку он выполняется в памяти, все объекты должны быть извлечены). Возможно, вы захотите сделать этот пакетный выбор спереди, чтобы ограничить количество операций ввода-вывода.

В зависимости от размера базы данных и количества сотрудников в рамках менеджера (и индексации), вы можете захотеть сделать все это на уровне базы данных ...

// 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 объект.

Как всегда, проблемы с производительностью обычно зависят от макета модели и от параметров, используемых для указания модели и ее отношений.

Смежные вопросы