Łą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>