2012-04-25 5 views
1

У меня есть два объекта с отношением один к одному. Category представляет мои заголовки разделов и SubSubCategory представляет мои строки.Фильтр NSPredicate, основанный на одном значении

Category 
{ 
    name:string 
    subs<-->>SubCategory 
} 

SubCategory 
{ 
    name:string 
    numbervalue:NSNumber 
} 

В настоящее время я могу использовать NSPredicate фильтровать свои разделы, основанные на имени.

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name==%@",@"anamevalue"]; 

Теперь я хочу, чтобы в дальнейшем фильтровать этот предикат возвращает только категории, которые имеют Subcategory с subvalue == 1.

Как я могу отфильтровать объект Category на основе значений от одного до многих детей?

Я пробовал что-то вроде этого, но это не хорошо.

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name==%@ AND subs.numbervalue==%@",@"anamevalue",1]; 

ответ

4

Я сделаю предикат, как следующее:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@ AND ANY subs.numbervalue == %@)", @"anamevalue", [NSNumber numberWithInt:1]]; 

ANY предикат модификатор, который возвращает истину, только если есть хотя бы один объект в коллекции Subs, для которых сравнение возвращает истинный.

То же самое можно сделать с помощью SUBQUERY.

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

+0

это блестящий спасибо. Не могли бы вы поделиться ссылкой на список модификаторов Predicate? Я никогда не сталкивался с этим в руководстве nspredicate programming – dubbeat

+0

Ищет ** Руководство по программированию предикатов **. Здесь раздел [Агрегатные операции] (https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Predicates/Articles/pSyntax.html#//apple_ref/doc/uid/TP40001795-215891), где вы можете найти полезную информацию. Надеюсь, поможет. –

0

Синтаксис в вашем предикате неверен. Вы передаете целочисленное значение в виде строки.

Ваш предикат должен быть

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name==%@ AND subs.numbervalue==%i",@"anamevalue",1] 

Другие, чем это выглядит правильно.