2011-04-21 23 views
7

Tengo un proyecto iOS 4 que utiliza Core Data. Cuando diseño el Core Data Model, los atributos tienen Integer 64, Integer 32, Integer 16, Decimal, Double, Float y Boolean.Cómo saber el tipo de propiedad NSNumber de Core Data

Pero en las subclases NSManagedObject generadas, todas son NSNumber*. Entonces, cuando lo uso, ¿cómo puedo saber si ese NSNumber es un long, un double, un float, o un BOOL?

Respuesta

8
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:myManagedObjectContext]; 
NSAttributeDescription *attribute = [[entity attributesByName] objectForKey:@"myAttribute"]; 
if ([attribute attributeType] == NSInteger32AttributeType) { 
    // We have an Integer32 
    // ... 
} 

Comprobar la cabecera NSAttributeDescription.h para otros tipos de atributos válidos además NSInteger32AttributeType.

+0

eso es lo que estoy buscando. Gracias. –

+0

Falta un corchete derecho en la instrucción if. Traté de editar, pero se rechazó porque hay un mínimo de 6 caracteres para las ediciones, pero tal vez tú (Ole) puedas editarlo ya que eres el autor original. –

+0

Gracias por señalarlo, Josh. Lo arreglé. –

0

no estoy seguro de que hay una manera de saber eso, pero para hacer su vida más fácil se puede crear una categoría para cada Entidad de Datos Básicos, y añadir nuevas incubadoras y captadores apropiados para el tipo real de sus atributos. En esos setters/getters tiene que hacer las conversiones de datos e invocar los generadores/captadores de datos centrales generados.

+0

la razón por la que quiero hacer esto, es necesario analizar algunos archivos similares a CSV. Tengo cientos de Entidades de Datos Básicos diferentes, realmente necesito una forma común y luego subclases cada entidad. –

0

La capa de datos centrales solo puede tratar con objetos, las diferentes selecciones que verá son cómo se almacenará en la base de datos subyacente. La clase NSNumber puede "convertir" libremente entre los valores anteriores. Simplemente seleccione lo que tiene sentido hacer en su caso. ¿Es un bool? luego guárdelo como tal (ocupa menos espacio en el db) ¿necesita alta precisión do double, etc. Cuando en tiempo de ejecución se ocupa de los valores, NSNumber se encargará de todo por usted. Así que un bool visitada en código es el siguiente:

if([[NSManagedObject isActive] boolValue]) 

o ajuste:

[[NSManagedObject setIsActive:[NSNumber numberWithBool:YES]]; 
+0

Creo que esto no es lo que pedí ... Iré por @Ole Begemann's –

2

NSNumber es puenteado con CFNumber de teléfono gratuito, y CFNumber puede hacer esto:

NSNumber *someNum = [myManagedObject someNum]; 
CFNumberType t = CFNumberGetType((CFNumberRef)someNum); 

El valor de enunciado CFNumberType le indica el tipo realmente utilizado por la clase de número para almacenar su valor. Pero no se garantiza que el tipo sea lo que dijiste que debería ser cuando creaste el número, por lo que si quieres saber qué tipo espera el modelo, debes hacer lo que Ole Begemann sugirió y obtener el tipo de atributo del AttributeDescription.