2010-05-12 4 views
1

J'ai un modèle de données avec une relation many-to-many comme EntityA <-->> EntityB <<--> EntityC. J'avais l'habitude de demander EntityA avec différents critères de recherche et j'utilise NSCompoundPredicate avec un tableau de NSPredicate s. Sur l'un des prédicat que je voulais interroger EntityA en utilisant EntityC. J'ai essayé d'utiliser le SUBQUERY suivant mais cela n'a pas fonctionné.Relation de plusieurs à plusieurs de données de base NSPredicate

searchPredicate=[NSPredicate predicateWithFormat:@"(0 != SUBQUERY(EntityB, $B, (0 != SUBQUERY($B.EntityC, $EntityC, $EntityC.name like %@)[email protected]))[email protected])", name] 

Et je suis l'exception suivante,

 
Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 
'Can't perform collection evaluate with non-collection object.' 

Est-ce que je suis absent. J'apprécierais toute aide.

Sarah

Répondre

3

(j'ai eu beaucoup de mal à votre déroutante prédicat afin de prendre cela avec un grain de sel.)

Je pense que votre faire de ce trop compliqué. Vous devriez simplifier avec Keypaths. Chaque EntityB a une relation de un à un avec EntityC, donc pour rechercher sur des objets EntityB tout ce que vous devez faire est de vérifier EntityB.entityCRelationshipName.entityCAttribute. Donc, quelque chose comme:

ALL B.EntityC.name like %@ 

Dans tous les cas, (si je lis le prédicat correctement) ceci:

SUBQUERY($B.EntityC, $EntityC, $EntityC.name like %@) 

ne peut retourner un seul objet au lieu d'une collection. Par conséquent, le prédicat ne sera pas en mesure d'effectuer un compte dessus. C'est ce que signifie votre message d'erreur.

Je suggère d'utiliser l'éditeur de prédicat dans l'éditeur de modèle de données pour extraire les prédicats avant de les stocker.

+0

Merci pour votre réponse, je vous ai utilisé avant l'approche, mais a obtenu l'exception suivante *** Termination app en raison d'exception non interceptée 'NSInvalidArgumentException', raison: 'prédicat non pris en charge TOUS B.EntityC.name LIKE "nom"' et I utilisé l'éditeur de prédicat pour le construire. – Sarah

+1

Essayez 'N'IMPORTE QUELLE entityB.entityC.name LIKE [c] $ aName' et fournissez la variable" aName ". Assurez-vous que vos noms de relations ne sont pas littéralement les mêmes que les noms d'entité. – TechZen

+0

N'importe quelle entitéB.entityC.name LIKE [c] $ aName a très bien fonctionné, merci – Sarah

Questions connexes