2013-11-27 3 views
2

У меня есть то, что я считал простой проблемой. Я пытаюсь отфильтровать некоторые основные данные, где у меня есть родительский объект, который имеет отношение «многие» к дочернему объекту, и этот дочерний объект имеет идентификатор строки. Я хочу получить все родительские объекты, где ни один дочерний объект не имеет определенного идентификатора.NSPredicate filter to-Many с дочерним объектом

Я попытался !(ANY... LIKE), а также !(ANY..==) и NONE с как и == и ALL children.id != otherid

Мой выполнение запроса выглядит следующим образом:

NSFetchRequest* fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Parent"]; 

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"NONE children.id LIKE %@",otherID]; 
[fetchRequest setPredicate: predicate]; 
NSError* error; 
NSArray* allParents = [[DataManager context] executeFetchRequest:fetchRequest error:&error]; 
//sanity check the predicate 
for (Parent* p in allParents) { 
    for (Child* c in p.children) { 
     if([c.id isEqualToString:otherID]){ 
      NSLog(@"PREDICATE FAIL!"); 
     } 
    } 
} 

Я пропускаю что-то с NSPredicate? Разрешен ли этот тип фильтрации для CoreData? Лучшее решение?

+0

возможно дубликат [Основные данные NSPredicate to-Many Relationship] (http://stackoverflow.com/questions/15722930/core-data-nspredicate-with-to- многие отношения) - Резюме: Это ошибка основных данных, и вы можете использовать SUBQUERY в качестве обходного пути. –

ответ

1

Я нашел аналогичный вопрос, хотя и не так просто. Получается, что ответ - сложный SUBQUERY. Вот что привело меня на охоте:

NSPredicate Aggregate Operations with NONE

и более открытое объяснение о подзапрос здесь:

http://funwithobjc.tumblr.com/post/2726166818/what-the-heck-is-subquery

Полученный предикат:

//in children get a $child and group all the $child objects together 
//where the ids match, if that groups count is 0 we know 
//the parent has no child with that id 
[NSPredicate predicateWithFormat: 
    @"SUBQUERY(children, $child, $child.id == %@)[email protected] == 0",objectId]; 
Смежные вопросы