web-dev-qa-db-fra.com

Comment configurer un NSPredicate pour rechercher des objets ayant un attribut nil

J'ai un ManagedObject class et l'un des membres de la classe est un NSDate. Je souhaite afficher tous les objets de la classe pour lesquels la date n'est PAS définie. J'ai essayé d'utiliser un prédicat comme ceci:

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(date = NIL)"];

Mais je reçois toujours des objets où la date est définie. Quelle est la bonne façon de configurer un prédicat pour cela?

47
mezulu

Je pense que c'est un problème de sensibilité à la casse. Vous pouvez utiliser "nil" ou "NULL", mais pas "NIL". Cela fonctionne bien pour moi:

NSPredicate *eventWithNoEndDate = [NSPredicate predicateWithFormat:@"endDate = nil"];
95

Deviner. Ne pouvait pas le faire en utilisant un prédicat avec un format de chaîne, donc essayé un prédicat avec un modèle et cela a fonctionné. Voici le code qui m'a donné des objets pour lesquels endDate était défini sur NULL:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"endDate = $DATE"];
predicate = [predicate predicateWithSubstitutionVariables:
                   [NSDictionary  dictionaryWithObject:[NSNull null] forKey: @"DATE"]];
10
mezulu

https://developer.Apple.com/library/mac/documentation/Cocoa/Conceptual/Predicates/Articles/pUsing.html#//Apple_ref/doc/uid/TP40001794-SW4

le code suivant devrait fonctionner

predicate = [NSPredicate predicateWithFormat:@"firstName = nil"];
3
Jerry Juang

Il existe un comportement extrêmement ennuyeux des requêtes d'extraction, documenté par Apple:

Si un objet dans un contexte a été modifié, un prédicat est évalué par rapport à son état modifié, et non par rapport à l'état actuel dans le magasin persistant. Par conséquent, si un objet dans un contexte a été modifié de manière à répondre aux critères de la demande d’extraction, celle-ci le récupère même si les modifications n’ont pas été enregistrées dans le magasin et si les valeurs du magasin ne répondent pas aux critères. Inversement, si un objet dans un contexte a été modifié de telle sorte qu'il ne corresponde pas à la demande d'extraction, celle-ci ne le récupérera pas, même si la version du magasin correspond.

Il est possible que vous effaciez la date ailleurs et que la demande d'extraction inclue des résultats dans lesquels la date est nil en mémoire mais toujours définie sur le disque (dans le magasin persistant). Ainsi, lorsque l'objet échoue, il charge l'objet avec la date définie. 

Mon seul conseil serait de coordonner l'accès au contexte de l'objet géré (par exemple, sur une NSOperationQueue) de sorte que toutes les mises à jour puissent être enregistrées dans le magasin persistant avant l'exécution de la demande d'extraction. 

0
Frank Schmitt