Фильтрация с NSPredicate в отношениях один-ко-многим - PullRequest
1 голос
/ 27 января 2012

Я перепробовал множество решений в stackoverflow, но не смог найти подходящее. У меня есть базовая модель данных с двумя объектами: клиент и пункт назначения. Оба упакованы в подклассы NSManagedObject.

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

У меня есть UITableViewController, где я использую следующее свойство fetchedController. Запрос работает хорошо. Я могу получить клиентов, хранящихся в SQLite.

if (fetchedResultsController) 
    return fetchedResultsController;

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Client" inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];

[fetchRequest setFetchBatchSize:20];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"code" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];

[fetchRequest setSortDescriptors:sortDescriptors];

fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil];

fetchedResultsController.delegate = self;

[fetchRequest release];
[sortDescriptor release];
[sortDescriptors release];

return fetchedResultsController;

Я бы сделал еще один шаг. Теперь я бы отфильтровал адресатов, извлеченных из предыдущего запроса (которые содержатся в адресатах NSSet) для каждого клиента. В частности, пункт назначения можно добавить, только если его значение default_dest равно 1.

Чтобы исправить эту спецификацию, я попытался добавить NSPredicate, как показано ниже:

NSPredicate* predicate = [NSpredicate predicateWithFormat:@"ANY destinations.default_dest == %@", [NSNumber numberWithInt:1]];

Затем я установил его в fetchRequest как:

[fetchRequest setPredicate:predicate];

Каждый раз, когда я запускаю запрос, он возвращает «пункты назначения ошибок во многих отношениях ...». Что это значит?

Я прочитал iphone-core-data-Relations-fault , но я не понимаю, что это значит.

Итак, мои вопросы: возможно ли достичь аналогичной цели? Если да, есть ли у вас какие-либо предложения?

Примечания

Очевидно, что я мог бы выполнить итерацию по заданным пунктам назначения, но я не знаю, может ли это быть дорогой итерацией и сколько там записей.

Ответы [ 2 ]

3 голосов
/ 22 марта 2012

Для интересующихся.

Вы должны указать своему запросу на выборку предварительную выборку отношений, используя

- (void)setRelationshipKeyPathsForPrefetching:(NSArray *)keys

Например:

[fetchRequest setRelationshipKeyPathsForPrefetching:[NSArray arrayWithObjects: @"destinations", nil]];

Таким образом, Core Data предварительно выбирает указанные вами отношения и не вызывает ошибку.

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

- (void)setFetchLimit:(NSUInteger)limit

Надеюсь, это поможет.

0 голосов
/ 27 января 2012

Вот другой способ получения определенных значений в fetch. Может быть, это поможет (посмотрите название ссылки в документе):

Извлечение определенных значений

...