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?
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"];
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"]];
le code suivant devrait fonctionner
predicate = [NSPredicate predicateWithFormat:@"firstName = nil"];
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.