使用CoreData NSPredicate多个ANY查询

时间:2013-11-19 15:58:55

标签: ios objective-c core-data nspredicate

我正在尝试查找对象的所有实例,其中包含对象图中单独对象组合的引用。

recommendation

可能包含以下三个对象中的一个或多个:

damageType

areaDamaged

validVehicles

此结构是通过导入现有系统的文件格式构建的,我无法重新构建对象图。

我正在使用NSPredicate查找所有recommendation个与damageType匹配所选损坏的对象,如下所示:

NSFetchRequest *fetchRequestDamages = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([Recommendation class])];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY damageType == %@", _currentRecordedDamage.damageType];

但希望过滤器返回与特定RecommendationsdamageTypeareaDamaged匹配的所有validVehicle

我试过

NSMutableArray *predicates = [[NSMutableArray alloc] initWithCapacity:2];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY damageType == %@", _currentRecordedDamage.damageType];
        [predicates addObject:predicate];
NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"ANY areaDamaged == %@", _currentAreaDamaged];
        [predicates addObject:predicate2];
NSPredicate *predicate3 = [NSPredicate predicateWithFormat:@"ANY validVehicles == %@", _currentVehicle];
        [predicates addObject:predicate3];


fetchRequestDamages.predicate = [NSCompoundPredicate andPredicateWithSubpredicates:predicates];


fetchRequestDamages.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]];

self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequestDamages managedObjectContext:[RKManagedObjectStore defaultStore].mainQueueManagedObjectContext sectionNameKeyPath:nil cacheName:nil];
self.fetchedResultsController.delegate = self;

NSError *error;

[self.fetchedResultsController performFetch:&error];
 int resultsFound = self.fetchedResultsController.fetchedObjects.count;

但似乎这会返回满足任何谓词的所有对象的集合 - 我想要匹配这三个对象的一组对象。

我正在考虑使用SUBQUERY但是不太了解如何创建此查询?

2 个答案:

答案 0 :(得分:4)

只需将三个谓词与“AND”结合起来,找到匹配所有谓词的对象:

NSArray *predicates = ... // your array of predicates
NSPredicate *finalPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:predicates];
[fetchRequestDamages setPredicate:finalPredicate];    

答案 1 :(得分:2)

为什么不在一个查询中使用AND? 类似的东西:

damage = %@ AND damagePoints = %@ AND damageCost = %@

damageType IN %@

上一个代码示例中的%@应该是数组/集合或其他内容。