Используя NSPredicate с Базовыми Данными для глубоких отношений

У меня есть NSArrayController, companiesController связанный с высокоуровневым объектом Данных Ядра, Companies.

A Company имеет многих Departmentи a Department имеет многих Employee; они представлены 1-many отношениями, departments и employees.

На основе атрибута salary из Employee Я думал, что мог динамично сделать это для фильтрации на основе зарплаты в вызываемом методе UI:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY departments.employees.salary < %@", [NSNumber numberWithInt:23000]];
[companiesController setFilterPredicate:predicate];

Увы, это дает мне ошибку: -[NSCFSet compare:]: unrecognized selector sent to instance.

11
задан gerry3 11 January 2010 в 18:59
поделиться

1 ответ

В этом случае в этом случае не допускаются множественные ключевые ключи.

Вместо этого вы можете сделать следующее:

  1. измените модель данных, добавив атрибут флаги «Фильтр» (Boolean) для сущности отдела.
  2. Создайте метод: PRETS Все объекты отдела, установите флаг фильтра для отделений, которые соответствуют критериям второй половины вашего предиката, установите флаг фильтра для отсутствия для других отделов и сохранить.
  3. Используйте флаг фильтра в предикате компании.

Изменения кода (шаг 3):

    //NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY departments.employees.salary < %@", [NSNumber numberWithInt:23000]];
    [self setDeptFilter:23000];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY depts.filter == YES"];
    [companiesController setFilterPredicate:predicate];

и новый метод (шаг 2):

- (void)setDeptFilter:(NSUInteger)salary {
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Department" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];

    NSError *error = nil;

    // fetch all Department objects
    NSArray *array = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];

    [fetchRequest release];

    if (error) {
        NSLog(@"Error fetching Departments %@, %@", error, [error userInfo]);
        abort();
    }

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY emps.salary < %@",[NSNumber numberWithInteger:salary]];
    NSArray *filterArray = [array filteredArrayUsingPredicate:predicate];

    // set filter flag to YES for the departments that meet the criteria
    for (Department *dep in filterArray) {
        dep.filter = [NSNumber numberWithBool:YES];
    }

    NSMutableArray *diffArray = [array mutableCopy];
    [diffArray removeObjectsInArray:filterArray];

    // set filter flag to NO for the departments that do NOT meet the criteria
    for (Department *dep in diffArray) {
        dep.filter = [NSNumber numberWithBool:NO];
    }

    [diffArray release];

    // save
    if ([self.managedObjectContext hasChanges] && ![self.managedObjectContext save:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    } 
}
17
ответ дан 3 December 2019 в 03:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: