Combinando as condições 'AND' e 'OR' no NSPredicate

De volta precisando de mais ajuda para construir meus NSPredicates :(

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

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

Eu gostaria de saber como criar um predicado comE eOU.

Por exemplo, gostaria de retornar todas as categorias com o nome == "category_name", que também tem uma subcategoria com um valor numérico de "valueA"OU "valueB".

Eu tentei todas as combinações possíveis de construtores de predicado que eu poderia criar, mas eu simplesmente não consigo fazê-lo funcionar.

Esta é a minha melhor tentativa até agora.

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

Editar 1

Segunda tentativa. A filtragem no 'numbervalue' ainda não está funcionando.

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

Editar 2

Eu tentei filtrar apenas por numberValue e deixei o nome fora alltogether.

1) usando isto resulta em todo o conjunto sendo retornado mesmo se apenas 1 item no conjunto tiver o valor.

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

2) Usar isso resulta no mesmo problema, sendo que todos os itens do conjunto são retornados, mesmo que apenas um deles corresponda.

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

Também usando a versão mais simples resulta no mesmo problema .... Eu não notei isso antes.

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

Então eu acho que tenho o meu problema reduzido.

Categoria é uma entidade. SubCategory é uma entidade.

A categoria tem um relacionamento para muitos com a SubCategory e é representada como um NSSet da SubCategory.

Cada subcategoria possui um atributo chamado numbervalue.

Editar 3

Para testar eu tenho 2 Categorys. Ambas as categorias têm 10 subs, cada um com um valor numérico de 1 a 10;

Usando este código, ambas as categorias são retornadas juntamente com todos os 10 subs para cada.

O resultado esperado é o retorno de ambas as categorias, cada uma com apenas dois subs.

Eu tracei todos os meus objetos e os dados estão corretos. O problema é que eu não posso retornar uma categoria que tenha subs filtrados.

<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