我正在尝试查找对象的所有实例,其中包含对象图中单独对象组合的引用。
recommendation
可能包含以下三个对象中的一个或多个:
damageType
areaDamaged
validVehicles
此结构是通过导入现有系统的文件格式构建的,我无法重新构建对象图。
我正在使用NSPredicate
查找所有recommendation
个与damageType
匹配所选损坏的对象,如下所示:
NSFetchRequest *fetchRequestDamages = [NSFetchRequest fetchRequestWithEntityName:NSStringFromClass([Recommendation class])];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY damageType == %@", _currentRecordedDamage.damageType];
但希望过滤器返回与特定Recommendations
,damageType
和areaDamaged
匹配的所有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
但是不太了解如何创建此查询?
答案 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 %@
上一个代码示例中的%@应该是数组/集合或其他内容。