Łączenie warunku „AND” i „OR” w NSPredicate

Powrót znowu potrzebuje więcej pomocy przy konstruowaniu moich NSPredicates :(

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

SubCategory
{
   name:string
   numbervalue:NSNumber
}
</code>

Chciałbym wiedzieć, jak utworzyć predykat za pomocąI iLUB.

Na przykład chciałbym zwrócić każdą kategorię o nazwie == „nazwa_kategorii”, która ma również podkategorię z wartością liczbową „valueA”LUB „valueB”.

Wypróbowałem każdą możliwą kombinację konstruktorów predykatów, które mogłem wymyślić, ale po prostu nie mogę go uruchomić.

To moja najlepsza próba do tej pory.

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

Edytuj 1

Drugie podejście. Filtrowanie „wartości liczbowej” nadal nie działa.

<code>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];
</code>

Edytuj 2

Próbowałem filtrować po prostu przez numberValue i zostawiłem nazwę razem.

1) użycie tego skutkuje zwróceniem całego zestawu, nawet jeśli tylko 1 element w zestawie ma wartość.

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

2) Użycie tego skutkuje tym samym problemem, każdy element w zestawie jest zwracany, nawet jeśli tylko jeden z nich pasuje.

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

Również użycie najprostszej wersji powoduje ten sam problem .... Nie zauważyłem tego wcześniej.

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

Myślę więc, że mój problem został zawężony.

Kategoria to Podmiot. SubCategory jest jednostką.

Kategoria ma relację jeden do wielu z SubCategory i jest reprezentowana jako NSSet SubCategory.

Każda podkategoria ma atrybut o nazwie wartość liczbowa.

Edytuj 3

Aby przetestować, mam 2 kategorie. Obie kategorie mają 10 podrzędnych, każdy o wartości 1 -10;

Używając tego kodu, obie kategorie są zwracane wraz ze wszystkimi 10 podrzędnymi dla każdej z nich.

Oczekiwany wynik to obie kategorie zwrócone, każda z 2 podrzędnymi.

Wyśledziłem wszystkie moje obiekty, a dane są poprawne. Problem polega na tym, że nie mogę zwrócić kategorii, która filtrowała subs.

<code>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();
}
</code>

questionAnswers(4)

yourAnswerToTheQuestion