2009-07-27 21 views
6

En mi modelo de datos core, tengo una entidad con un atributo NSNumber opcional.Almacenamiento de NSNumber opcional en Core Data

¿Cómo puedo probar para ver si el valor en ese atributo es válido o no?

Cuando pruebo nulo ... no funciona.

[self numberAttribute] == nil // always returns NO 

Cuando pruebo para un valor cero int, eso no funciona.

[[self numberAttribute] intValue] == 0 // always returns no 

Como cuestión de hecho, [[auto numberAttribute] intValue]] se vuelve algo que se parece sospechosamente a un puntero a una dirección de memoria.

¿Alguien tiene alguna idea de lo que estoy haciendo mal?

EDIT: Bien, el error estaba en una parte del código totalmente ajena. NSNumber y Core Data funcionan exactamente como uno esperaría. Dicho esto, voy a ir con el enfoque sugerido de hacer que el atributo no sea opcional y especificar 0 como el valor predeterminado.

Acabo de poner esta nota aquí por un tiempo para cualquiera que estuviera viendo esta pregunta, entonces la borro.

+1

Todavía no tengo suficientes representantes para editar, pero su segundo ejemplo de código tiene corchetes desequilibrados (2 corchetes de apertura y 3 de cierre). – Mark

+0

Muchas gracias. Fijo. – mmc

+0

numberAttribute se especifica como un flotante en el modelo de datos? ¿Cómo se declara la propiedad para numberAttribute? ¿A qué se parecen o implementaciones? (Si no está utilizando accesadores @dinámicos) Sin esta información, su pregunta es imposible de responder con precisión. –

Respuesta

0

Si obtiene un gran valor de nuevo que se parece a un puntero, tal vez es NaN (no es un número)?

Si es así, se puede comprobar con:

isnan([[self numberAttribute] doubleValue]) 

O, posiblemente se trate de alguna otra constante a lo largo de las líneas de NSNotFound (aunque probablemente más datos básicos específicos).

+0

Probé varios sabores diferentes de esta técnica, no funcionó. El valor que recibo no es una constante e informa en el depurador (columna Resumen) como "Inválido". Es bastante extraño, supuse que si no establecía el atributo en absoluto, y si estaba marcado como "opcional" con un valor predeterminado de "0" en el modelo .xcdata, esto simplemente no sería tan difícil de lograr. – mmc

+0

Si lo tiene marcado como opcional, no se establecerá el valor predeterminado ... Creo que básicamente está recuperando algún tipo de objeto no válido que representa un estado indeterminado. No puedo encontrar en Core Data cómo se supone que debes reconocer un objeto no válido ... –

+0

Lo verifiqué con otra persona que tiene un proyecto de Core Data con atributos opcionales, pensó que un valor no establecido debería ser nulo, tal como lo estabas buscando. Así que me gustaría ir con la teoría de que estás recuperando un objeto NSNumber como lo postulaba porneL. –

5

De acuerdo con la documentation,

Puede especificar que un atributo es opcional, es decir, no se requiere que tenga un valor. En general, sin embargo, no se recomienda hacerlo, especialmente para los valores numéricos (normalmente puede obtener mejores resultados utilizando un atributo obligatorio con un valor predeterminado -en el modelo- de 0). La razón de esto es que SQL tiene un comportamiento de comparación especial para NULL que es diferente de Objective-C nil. NULL en una base de datos no es lo mismo que 0, y las búsquedas de 0 no coincidirán con las columnas con NULL.

false == (NULL == 0) 
false == (NULL != 0) 

Por otra parte, NULL en una base de datos no es equivalente a una cadena vacía o blob de datos vacío, ya sea:

false == (NULL == @"") 
false == (NULL != @"") 

lo tanto, intentar una prueba con NULL, que es no es nada Mejor aún, establezca un valor predeterminado y cambie el atributo para que no sea opcional. Eso es lo que terminé haciendo en mis modelos, y en la práctica funciona bastante bien.

Editar: Ver mi comentario más arriba. Traté de crear un nuevo objeto gestionado con un atributo opcional no establecido, y era nulo.

BOOL isNil = ([newManagedObject numberAttribute] == nil); //equals YES 

Otra edición: volví a esto más tarde y nos fuimos un objeto cargado desde la memoria caché en el depurador (gdb es tu amigo!). Intentaba acceder a la ubicación de memoria 0x0, que es NULL.

+0

Sí, pero la verdadera pregunta es si tiene un atributo declarado opcional, ¿cómo verifica si está configurado o no? –

+0

Es cierto. Revisé más y agregué detalles a mi respuesta. – Don

+0

Acepto que ese es el control adecuado, el misterio es que no está obteniendo nada, pero tiene un valor extraño ... –

0

Si parece un puntero, puede ser un puntero a la instancia NSNumber. Asegúrese de que no haya discrepancias entre el modelo de datos principal y la clase (por ejemplo, NSInteger donde se espera NSNumber*).

Si tiene escalar en su clase, entonces necesita tenerlo en cuenta en setNilValueForKey:.

+1

Esto me parece muy bien (no es que alguien con un sombrero tan impresionante necesite respaldo de ninguna manera). –