2013-11-19 5 views
2

Я пытаюсь найти все экземпляры объекта, которые содержат ссылку на комбинацию отдельных объектов в моем графе объектов.NSPredicate несколько ANY запросов с CoreData

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

Что ваш код для выполнения выборки запроса? –

+0

Обновлен код – davbryn

+0

@ davbryn: Итак, вы уже делаете то, что я предложил ниже. - Возможно, вы можете показать пример того, что вы получаете в настоящее время и чего вы ожидаете. –

ответ

4

Просто объединить три предиката с «И», чтобы найти объекты, которые соответствуют всем из них:

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

Когда у меня есть три предиката AND, он возвращает набор, содержащий рекомендации, которые не имеют действительного соответствия Vehicle в его наборе (но имеет соответствие для другого свойства). – davbryn

+1

@ davbryn: Это странно. Он должен возвращать только объекты, которые удовлетворяют всем трем субиндикатам. - Вы тестировали все три предиката отдельно? –

+0

Разве это не то, что он делает в своем коде? 'fetchRequestDamages.predicate = [NSCompoundPredicate andPredicateWithSubpredicates: predicates];' – FelixLam

2

Почему бы не использовать AND в одном запросе? Что-то вроде:

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

и:

damageType IN %@ 

Где% @ в последнем примере кода должен быть массивом/установить или что-то другое.

+0

Очень аккуратно использовать сложный предикат –

+0

@DavidCaunt, если у вас 2-3 оператора - это нормально использовать многофункциональное устройство, иначе вам определенно следует использовать сложные предикаты. – AndrewShmig

Смежные вопросы