2009-07-22 8 views
42

J'ai un modèle de données de base dans lequel une entité de tâche inclut une relation facultative to-many exclueOccurrences. L'une des propriétés de excludedOccurrences est start, qui est un objet NSDate. L'entité ExcludedOccurrence a une relation inverse to-one obligatoire avec l'entité Task.Données de base, clés NSPredicate et à plusieurs

Afin d'extraire des tâches pour un jour spécifié, je dois m'assurer que le jour spécifié n'apparaît pas comme la propriété start d'une entité ExcludedOccurrence. L'un des sous-prédicats je suis en train d'utiliser est donc

NSPredicate *occurrenceIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"(ALL excludedOccurrences.start != %@))", today]; 

où aujourd'hui est un objet NSDate pour aujourd'hui, y compris seulement les composantes jour, mois et année. Toutes les occurrences de début d'occurrences exclues incluent également uniquement les composants du jour, du mois et de l'année.

Bien que cela devrait bien, au moins la lecture de la documentation de base de données et NSPredicate, je reçois le message d'erreur suivant:

Mettre fin application en raison d'une exception non interceptée « NSInvalidArgumentException », la raison: « prédicats non pris en charge

Si j'utilise le prédicat équivalent

NSPredicate *occurrenceIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"!(ANY excludedOccurrences.start == %@))", today]; 

aucune exception est levée, mais le code ne fonctionne pas comme prévu: l'apparition d'aujourd'hui, qui ne devrait pas être exclu, est exclu à la place.

Je ne suis pas sûr aussi comment tester les excludedOccurrences de cas == nil: le prédicat suivant

NSPredicate *nilPredicate = [NSPredicate predicateWithFormat: @"(excludedOccurrences == nil)"]; 

causes qui sont à l'exécution à l'exception

à plusieurs clé ne permet ici

Cependant, étant donné que la relation excludedOccurrences est facultative, j'ai également besoin de tester si elle est nulle.

Comment faire face à cela? Merci d'avance.

Répondre

28

avec l'aide de vous tous, j'ai finalement réussi à déterminer le prédicat correct pour mon scénario. On dirait qu'un objet NSDate est traité comme un double, cependant, le double n'est jamais quelque chose comme 3.7, c'est toujours comme 3.0 Par conséquent, le prédicat suivant fonctionne correctement dans mes tests:

NSPredicate *occurrenceIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"([email protected] == 0 || ([email protected] > 0 && NONE excludedOccurrences.start == %@))",thisDate]; 

où thisDate est un objet NSDate ne contenant que les composants jour, le mois et l'année (comme dans le cas de la propriété début de l'entité ExcludedOccurrence

.

test pour une relation vide est essentiellement fait en utilisant l'opérateur global @count, comme suggéré par certaines personnes chez Apple.

encore une fois, merci beaucoup pour votre aide. Je remarque encore que la documentation est erronée dans plusieurs pièces (surtout là où dit que TOUT fonctionne bien alors qu'à la place, ça ne marche pas du tout).

108

Pour tester une relation vide, vous devez comparer le nombre de clés à zéro à zéro.

[NSPredicate predicateWithFormat:@"[email protected] == 0"]; 

Quant à votre subpredicates, sachez que vous ne pouvez avoir qu'un seul soit des ALL ou ANY modificateurs dans votre prédicat finale, bien que vous pouvez utiliser ce modificateur plusieurs fois dans le prédicat.

Non OK: ANY foo.bar = 1 AND ALL foo.baz = 2
OK:ANY foo.bar = 1 AND !(ANY foo.baz != 2)

+0

votre solution de relation vide se bloque pour moi. –

+0

Désolé, le format de prédicat a été corrigé. Je n'ai jamais pris la peine de tester mon hypothèse quand cela a été posté, apparemment personne d'autre ne l'a fait non plus. –

+1

Il est incroyable combien de temps j'ai cherché à tester un un-à-plusieurs pour une relation vide. Tellement content que tu l'aies posté ici! –

8

Ainsi, pour tester une relation non vide, cela fonctionne réellement:

[NSPredicate predicateWithFormat:@"[email protected] != 0"] 

La solution donnée par Ashley Clark tombe en panne pour me donner « à plusieurs clés non autorisés ici »

+0

J'ai corrigé ma réponse, je ne sais pas à quoi je pensais quand j'ai écrit ça. Mea culpa. –

Questions connexes