我又回来了,需要更多帮助来构建我的NSPredicate :(
Category
{
name:string
subs<-->>SubCategory
}
SubCategory
{
name:string
numbervalue:NSNumber
}
我想知道如何创建一个带有AND和OR的谓词。
例如,我想返回每个类别名称为"category_name"且具有子类别数字值为"valueA" 或 "valueB"的类别。
我尝试了我能想到的所有谓词构造函数的可能组合,但是我无法使其正常工作。
这是我迄今为止最好的尝试。
NSPredicate *predicate=[NSPredicate predicateWithFormat@"(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过滤,完全忽略了名称。
1)使用这种方法会返回整个集合,即使集合中只有一个项目具有该值。
predicate=[NSPredicate predicateWithFormat:@"(ANY subs.numbervalue IN %@)",arr];
2) 使用这种方法会遇到相同的问题,即使只有一个项目匹配,也会返回集合中的每个项目。
predicate=[NSPredicate predicateWithFormat:@"((SUBQUERY(subs, $x, $x.numbervalue == %@ or $x.numbervalue == %@).@count > 0)", value1, value2];
同时使用最简单的版本也会导致相同的问题... 我之前没有注意到这一点。
NSPredicate *predicate=[NSPredicate predicateWithFormat@"(ANY subs.numbervalue==%@ ,valueA];
我认为我已经缩小了我的问题。
Category是一个实体(Entity)。 SubCategory也是一个实体。
Category与SubCategory之间具有一对多的关系,并表示为SubCategory的NSSet。
每个SubCategory都有一个名为numbervalue的属性。
编辑3
为了测试,我有2个Category。 两个Category都有10个子类,每个子类的numbervalue都是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();
}
NSCompoundPredicate
吗?它应该会对你有所帮助。另外尝试使用... AND (ANY subs.numberValue IN %@)", @"fooName", numArray
。 - Eimantas