Еще раз нужна дополнительная помощь при построении моих NSPredicates: (
Category
{
name:string
subs<-->>SubCategory
}
SubCategory
{
name:string
numbervalue:NSNumber
}
Я хотел бы знать, как создать предикат с И и ИЛИ.
Например, я хотел бы возвратить каждую категорию с именем == "category_name", которое также имеет подкатегорию с numbervalue "valueA" ИЛИ "значениеB".
Я пробовал все возможные комбинации конструкторов предикатов, которые я мог бы придумать, но я просто не могу заставить его работать.
Это моя лучшая попытка.
NSPredicate *predicate=[NSPredicate [email protected]"(name== %@) AND (ANY subs.numbervalue==%@ OR ANY subs.numbervalue==%@)", @"aname", value1, value2];
Изменить 1
Вторая попытка. Фильтрация на "numbervalue" все еще не работает.
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
Я пробовал фильтрацию только с помощью numberValue и оставил имя alltogether.
1), используя это, приводит к возврату всего набора, даже если только 1 элемент в наборе имеет значение.
predicate=[NSPredicate predicateWithFormat:@"(ANY subs.numbervalue IN %@)",arr];
2) Используя этот результат в той же самой задаче, каждый элемент в наборе возвращается, даже если только 1 из них соответствует.
predicate=[NSPredicate predicateWithFormat:@"((SUBQUERY(subs, $x, $x.numbervalue == %@ or $x.numbervalue == %@)[email protected] > 0)", value1, value2];
Также использование простейшей версии приводит к той же проблеме.... Я этого раньше не заметил.
NSPredicate *predicate=[NSPredicate [email protected]"(ANY subs.numbervalue==%@ ,valueA];
Итак, я думаю, что моя проблема сузилась.
Категория - это объект. SubCategory - это сущность.
Категория имеет отношение "один-много" к подкатегории и представлено как NSSet подкатегории.
Каждая подкатегория имеет атрибут с именем numbervalue.
Изменить 3
Чтобы проверить, у меня есть 2 категории. Обе категории имеют 10 подсетей, каждый с numbervalue 1 -10;
Используя этот код, обе категории возвращаются вместе со всеми 10 подмножествами для каждого.
Ожидаемый результат: возвращаются обе категории, каждая с двумя слотами.
Я проследил все мои объекты, и данные верны. Проблема в том, что я не могу вернуть категорию, которая отфильтровала subs.
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==%@)[email protected]> 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();
}