NSArrayController выборка против предиката фильтра

Я работаю над приложением для Mac и изо всех сил пытаюсь заставить работать фильтр предикатов. Есть ли разница в том, как использовать предикаты fetch vs filter для NSArrayController?

Я использую Core Data для хранения своих записей, и они отлично отображаются в моем табличном представлении. Когда я использую предикат выборки, он правильно отображает записи. Когда я использую предикат фильтра, он, кажется, ничего не делает. Чтобы быть ясным - я использую один предикат за раз, но хотел показать оба в своем коде.

entryController = [[NSArrayController alloc] init];
[entryController setManagedObjectContext:[self managedObjectContext]];
[entryController setAutomaticallyPreparesContent:YES];
[entryController setAutomaticallyRearrangesObjects:YES];
[entryController setClearsFilterPredicateOnInsertion:NO];
[entryController setEntityName:@"Entry"];

// only displays entries where deleted is not 1
[entryController setFetchPredicate:[NSPredicate predicateWithFormat:@"deleted != %@", [NSNumber numberWithInt:1]]];

// shows all entries regardless of the deleted status
[entryController setFilterPredicate:[NSPredicate predicateWithFormat:@"deleted != %@", [NSNumber numberWithInt:1]]];

if ([entryController fetchWithRequest:nil merge:YES error:&error] == NO) {
    DLog(@"Error fetching entries: %@", error.description);
} else {
    DLog(@"Found %lu entries.", [[entryController arrangedObjects] count]);
}

person Josh Rickard    schedule 08.09.2011    source источник
comment
После установки предиката фильтра вы говорите NSTableView перезагрузить данные?   -  person sosborn    schedule 08.09.2011
comment
Да, я перезагружаю данные просмотра. Я также уверен, что удаленное значение равно 1, потому что 1) оно работает с предикатом выборки и 2) я печатаю значение как часть ячейки.   -  person Josh Rickard    schedule 08.09.2011
comment
Я еще раз взглянул на ваш код. Понимаете ли вы, что нет разницы между предсказанием выборки и предикатом фильтра? Они оба оценивают одинаково.   -  person sosborn    schedule 08.09.2011
comment
Да, вот что меня смущает. Кажется, что любой способ должен работать, если я не понимаю, как работают предикаты фильтра.   -  person Josh Rickard    schedule 08.09.2011


Ответы (2)


Похоже, что ключевое слово «удалено» имеет какое-то неизвестное значение для Core Data. Я переименовал свою собственность, и проблема была решена. В этом сообщении блога также упоминается та же проблема: http://roobasoft.com/blog/2006/04/25/secret-core-data-reserved-keywords/

person Josh Rickard    schedule 09.09.2011

Насколько я понимаю, fetchPredicate выполняется на уровне хранилища, а filteringPredicate выполняется в памяти после того, как объекты уже были извлечены.

person Tony    schedule 24.12.2011
comment
Итак, может ли контроллер массива без предиката выборки, но с предикатом фильтра извлекать все экземпляры и фильтровать их впоследствии? - person bijan; 17.03.2012