Объединение & #39;И& #39; и & #39;ИЛИ& #39; Условие в NSPredicate

Снова нуждаюсь в дополнительной помощи с созданием предикатов NSP:(

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

SubCategory
{
   name:string
   numbervalue:NSNumber
}

Я хотел бы знать, как создать предикат с И и ИЛИ .

Например, я хотел бы вернуть каждую категорию с именем == "категория _имя", которая также имеет подкатегорию с числовым значением "valueA" ИЛИ "valueB".

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

Пока это моя лучшая попытка.

NSPredicate *predicate=[NSPredicate predicateWithFormat@"(name== %@) AND (ANY subs.numbervalue==%@ OR ANY subs.numbervalue==%@)", @"aname", value1, value2];

Правка 1

Вторая попытка. Фильтрация по «числовому значению» по-прежнему не работает.

NSNumber valueA=[NSNumber numberWithInt:20];
NSNumber valueA=[NSNumber numberWithInt:90];
NSArray *arr=[NSArray arrayWithObject:valueA,valueB,nil];

predicate=[NSPredicate predicateWithFormat:@"(name==%@)AND(ANY subs.numbervalue IN %@)",@"aname",arr];

Редактировать 2

Я пробовал фильтровать только по номеру_значения и полностью исключил имя.

1 )Использование этого приводит к возврату всего набора, даже если только 1 элемент в наборе имеет значение.

predicate=[NSPredicate predicateWithFormat:@"(ANY subs.numbervalue IN %@)",arr];

2 )Использование этого приводит к той же проблеме, каждый элемент в наборе возвращается, даже если только 1 из них соответствует.

predicate=[NSPredicate predicateWithFormat:@"((SUBQUERY(subs, $x, $x.numbervalue == %@ or $x.numbervalue == %@).@count > 0)", value1, value2];

Также использование самой простой версии приводит к той же проблеме... Раньше я этого не замечал.

NSPredicate *predicate=[NSPredicate predicateWithFormat@"(ANY subs.numbervalue==%@,valueA];

Итак, я думаю, что моя проблема сузилась.

Категория является Сущностью. Подкатегория является сущностью.

Категория имеет отношение «один ко многим» с подкатегорией и представлена ​​как NSSet подкатегории.

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

Редактировать 3

Для тестирования у меня есть 2 категории. Обе категории имеют 10 подпрограмм, каждая из которых имеет числовое значение 1 -10;

При использовании этого кода обе категории возвращаются вместе со всеми 10 подписками для каждой.

Ожидаемый результат: возвращены обе категории, в каждой из которых всего 2 подписки.

Я проследил все свои объекты, и данные верны. Проблема в том, что я не могу вернуть категорию с отфильтрованными подписками.

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSManagedObjectContext *context=[[DataSource sharedDataSource]managedObjectContext];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Category" inManagedObjectContext:context];
[fetchRequest setEntity:entity];

[fetchRequest setFetchBatchSize:20];

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

NSPredicate *predicate;
NSNumber *a=[NSNumber numberWithFloat:1];
NSNumber *b=[NSNumber numberWithFloat:2];
predicate=[NSPredicate predicateWithFormat:@"(SUBQUERY(subs,$x,$x.numbervalue==%@ or $x.numbervalue==%@).@count> 0)",a,b];

[fetchRequest setPredicate:predicate];
[fetchRequest setSortDescriptors:sortDescriptors];

NSError *error = nil;
[NSFetchedResultsContoller deleteCacheWithName:nil];

NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:@"name" cacheName:@"Master"];
aFetchedResultsController.delegate = self;

self.fetchedResultsController = aFetchedResultsController;

if (![self.fetchedResultsController performFetch:&error]) {

   NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
   abort();
}
43
задан dubbeat 26 April 2012 в 11:01
поделиться