1

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

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

У меня есть 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-relationship-fault, но я не понимаю, что это значит.

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

Примечание

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

ответ

3

Для тех, кто заинтересован в

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

- (void)setRelationshipKeyPathsForPrefetching:(NSArray *)keys 

Например:

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

В этом человеке ner Core Data предварительно задает указанные вами отношения и не срабатывает.

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

- (void)setFetchLimit:(NSUInteger)limit 

Надеется, что это помогает.

-1

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

Fetching Specific Values