2011-04-21 11 views
46

Tengo un ManagedObject class, y uno de los miembros de la clase es un NSDate. Me gustaría mostrar todos los objetos de la clase para los cuales NO está establecida la fecha. He intentado utilizar un predicado como esto:¿Cómo configuro un NSPredicate para buscar objetos que tengan un atributo nulo?

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

Pero todavía consigo los objetos donde se desarrolla la date. ¿Cuál es la forma correcta de establecer un predicado para esto?

Respuesta

93

creo que es una cuestión de mayúsculas y minúsculas. Puede usar "nil" o "NULL", pero no "NIL". Esto funciona muy bien para mí:

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

¿Sabe por qué el formato debe ser @ "endDate = nil" y no @ "endDate == nil"? Hubiera pensado con seguridad que debería ser el signo doble igual, pero == no produce el efecto deseado en este caso. Impar porque otras comparaciones de predicados sí funcionan con ==. – kris

+1

@kris No estoy seguro. http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Predicates/Articles/pSyntax.html#//apple_ref/doc/uid/TP40001795-SW1 parece sugerir que '=' y '= = 'son equivalentes, pero los ejemplos en http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Predicates/Articles/pUsing.html#//apple_ref/doc/uid/TP40001794-SW4 usan' = ' –

+10

gracias.Estoy viendo que = y == no se están comportando igual en esta circunstancia así que se dirige a todos – kris

9

Lo descubrí. No se pudo hacer usando un predicado con un formato de cadena, así que probé un predicado con una plantilla y funcionó. Aquí está el código que me dio objetos que habían establecido endDate a NULL:

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

Francamente, me sentiría más seguro haciendo esto que siguiendo el ejemplo más simple que da chrispix a continuación, teniendo en cuenta las irregularidades sintácticas de las pruebas de nulo a través de los predicados sobre los que él y kris debaten. – Wienke

+0

¡Gracias! Pero, ¿cómo se filtraría si necesita dos variables de filtro? Gracias – KarenAnne

+0

Etiquetado @mezulu – KarenAnne

0

Hay un comportamiento muy molesta de ir a buscar solicitudes, según lo documentado por Apple:

Si un objeto en un contexto ha sido modificado, un predicado se evalúa contra su estado modificado, no contra el estado actual en la tienda persistente. Por lo tanto, si un objeto en un contexto se ha modificado de manera que cumpla con los criterios de solicitud de recuperación, la solicitud lo recupera incluso si los cambios no se han guardado en la tienda y los valores en la tienda son tales que no cumple los criterios. Por el contrario, si un objeto en un contexto se ha modificado de manera que no coincida con la solicitud de búsqueda, la solicitud de recuperación no lo recuperará, incluso si la versión en la tienda coincide.

Es posible que usted está despejando la fecha en otros lugares y la solicitud de búsqueda está incluyendo los resultados en que la fecha es nil en la memoria, pero aún situado en disco (en el almacén persistente), y así, cuando los defectos del objeto se carga el objeto con la fecha establecida.

Mi único consejo sería coordinar el acceso al contexto del objeto gestionado (por ejemplo, en un NSOperationQueue) para que cualquier actualización pueda guardarse en el almacenamiento persistente antes de ejecutar la solicitud de búsqueda.

Cuestiones relacionadas