2012-04-26 10 views
15

Si tengo un objeto NSManagedObject que he extraído de un contexto, ¿cómo puedo crear un NSDictionary de sus propiedades dinámicas sin solo copiar cada campo en el diccionario explícitamente?Obtener propiedades de NSManagedObject como NSDictionary

Si mi objeto administrado se parece a esto, por ejemplo:

@implementation Track 

@dynamic artist; 
@dynamic group; 
@dynamic purchase_url; 
@dynamic title; 
@dynamic file_name; 
@dynamic year; 

@end 

Después de ir a buscar la base de datos, en este caso, necesito una NSDictionary con las mismas propiedades establecidas para cada una de esas propiedades @dynamic.

+1

Podría dar más detalles acerca de por qué quiere hacer esto, puede haber una mejor manera de lograr lo que quieres Mientras tanto, mira NSEntityDescription y attributesByName. – jrturton

+1

Eche un vistazo a [este artículo] (http://vladimir.zardina.org/2010/03/serializing-archivingunarchiving-an-nsmanagedobject-graph/). También te cubre por cualquier relación. – Alladinian

Respuesta

46

Hay una manera más rápida de convertir un NSManagedObject a un NSDictionary (de Matthias Bauch respuesta a https://stackoverflow.com/a/5664745/2294824):

NSArray *keys = [[[myObject entity] attributesByName] allKeys]; 
NSDictionary *dict = [myObject dictionaryWithValuesForKeys:keys]; 
+0

Gracias por esta respuesta, me ayuda a terminar un problema de larga data. –

+0

¿hay un reverso para esto? NSdiccionario a CoreData? – Nil

+1

Reverse se describe en el enlace de la respuesta: [myObject setValuesForKeysWithDictionary: dict] – Werewolf

10

Puede alcanzar su enfoque al siguiente método:

unsigned int count; 
objc_property_t *properties = class_copyPropertyList([CoreDataObject class], &count); 
NSMutableDictionary *dictionary = [NSMutableDictionary dictionaryWithCapacity:16]; 

for(int i = 0; i < count; i++) { 
    objc_property_t property = properties[i]; 
    NSString *name = [NSString stringWithCString:property_getName(property) encoding:NSUTF8StringEncoding]; 
    id obj = [coreDataObjectInstance valueForKey:name]; 
    if (obj) { 
     // Skip properties with nil values (optionally you can use: [dictionary setObject:((obj == nil) ? [NSNull null] : obj) forKey:name]; without any if-statement) 
     [dictionary setObject:obj forKey:name]; 
    } 
} 

free(properties); 

"CoreDataObject" son los datos básicos objeto que desea convertir en un NSDictionary mientras que "coreDataObjectInstance" es una instancia de este objeto de datos central. Tenga en cuenta que usted tiene que:

#include <objc/runtime.h> 

Por otra parte, sería muy bueno si nos puede dar algunas ideas más lo que le gustaría lograr con esta idea, tal vez hay una solución mejor/diferente.

Espero que esto ayude!

+0

Me gustaría compartir con usted detalles sobre en qué puedo usar esto, quiero hacer una ventana de inspector, por lo que si seleccionó una fila en una tabla llena con la subclase nsmanagedobject, la ventana del inspector mostrará las propiedades de este managedObject en cuento de tres columnas: nombre de la propiedad, tipo de propiedad "cadena, int ..." y valor del atributo ¿cuál crees que es la mejor manera de lograr este escenario? – AMTourky

6

creo que esto es lo que en realidad estás buscando:

NSEntityDescription *trackEntity = [NSEntityDescription entityForName:[Track entityName] inManagedObjectContext:yourMOC]; 

entonces tienen acceso a estos diccionarios:

[trackEntity propertiesByName]; 
[trackEntity relationshipsByName]; 
[trackEntity attributesByName]; 

cada uno de estos diccionarios tendrá teclas correspondientes a la propiedad, y el valor será una NSPropertyDescription.

+0

relationshipsByName devuelve un diccionario de valores que son objetos NSRelationshipDescription .... –

Cuestiones relacionadas