2009-08-13 8 views
0

J'ai une entité Core Data appelée Album; un album a une relation avec les entités Song (appelées chansons), et chaque Song a un nombre arbitraire d'entités Tag (dans une propriété tags), les tags ont un nom. Maintenant, je veux vérifier si l'une des chansons d'un album contient une étiquette; en utilisant un seul NSPredicate.NSPredicates et doubles relations to-n

Une des idées qui viennent à l'esprit était:

[NSPredicate predicateWithFormat: @"ANY (ANY songs).tags LIKE %@", someTagName]; 

Mais ce qui provoque une erreur lors de l'exécution (« Impossible d'analyser la chaîne de format »). J'ai essayé différentes variantes, sans succès.

Y at-il un moyen de le faire?

Répondre

0

Je pense que vous voulez

[NSPredicate predicateWithFormat:@"ANY [email protected] LIKE %@", someTagName] 

Vérifiez la section Guide de programmation-valeur clé sur set and array operators.

+0

Ça a l'air vraiment bien, je l'ai essayé, mais je suis coincé à nouveau. Cela ne m'arrive généralement pas souvent ... Maintenant, j'obtiens l'exception suivante: *** Terminant l'application en raison d'une exception non interceptée 'NSUnknownKeyException', raison: '[ valueForUndefinedKey:]: l'entité L'album n'est pas compatible avec le codage de valeur de clé pour les «morceaux clés». @ DistinctUnionOfSets.labels ". ' J'ai essayé le tour, mais je ne pouvais pas trouver un endroit où je pourrais mettre le @distinctUnionOfSets sans causer ce genre de crash. Toute idée de ce que je fais mal? –

+0

@Julian Désolé, c'est ma faute pour écrire sans test. Comme je n'ai pas de projet Core Data pour jouer avec, je travaille d'arrache-pied. Avez-vous essayé @unionOfSets, pas @distinctUnionOfSets? Je me bats toujours un peu avec ces opérateurs. Je dois souvent mettre un point d'arrêt sur une ligne comme [album valueForKeyPath: @ "songs.tags"] et voir quel est le résultat dans le débogueur. Si c'est un ensemble de sets, alors @ unionOfSets.songs.tags devrait le faire. Si c'est quelque chose d'autre, vous devrez modifier le keypath de manière appropriée. –

0

Juste une idée, mais peut-être que LIKE n'est pas disponible sur l'iPhone? Je sais que j'ai eu du mal avec BETWEEN, qui ne semble pas fonctionner.

Donc une étiquette n'a pas une relation plusieurs-à-plusieurs avec des chansons? Si cela était modélisé de cette façon, obtenir les chansons d'un tag impliquerait simplement d'accéder à la propriété tag.songs. La façon dont vous l'avez modélisé, il semble que les tags peuvent être dupliqués pour chaque chanson (ce qui peut être très bien dans votre application).

Questions connexes