2010-08-16 16 views
6

Tengo que almacenar un objeto de clase personalizado en Coredata. El problema es que mi clase personalizada contiene estructuras, enum, etc. Intenté seguir el método.Cómo almacenar objetos personalizados con struct en Coredata

- (void) encodeWithCoder: (NSCoder *) encoder.

Pero estoy consiguiendo este error

[NSKeyedArchiver encodeValueOfObjCType: en:]: este archivador no puede codificar estructuras

¿Cuál es la mejor práctica para almacenar este objeto para CoreData. Por favor, ayúdame.

Respuesta

6

Puede envolver la estructura en un NSData, es decir

Para codificar con archivador

[coder encodeObject:[NSData dataWithBytes:&my_struct length:sizeof(my_struct)] 
      forKey:@"my_struct"]; 

y decodificar con archivador

NSData *data = [coder decodeObjectForKey:@"my_struct"]; 
[data getBytes:&my_struct length:sizeof(my_struct)]; 
+0

usando dataWithBytes: length: no es portable entre diferentes plataformas endian o 32/64 bit. El uso de esto ocasionará que los datos anteriores se peguen al dispositivo dado y los usuarios no podrán actualizar a diferentes plataformas o transferir/abrir el archivo en una plataforma diferente a la que se creó. –

+0

@Brent Claro ... pero la pregunta es sobre iPhone y creo que esto debería funcionar bien durante unos años ... y si Apple cambiará el hardware, creo que (a) tendrán un período usando un emulador para traerlo tanto software como sea posible (b) el programa deberá ser recompilado y puede ser reparado cuando sea necesario (si es necesario) ... y es solo un problema para "datos" creados/almacenados en un tipo de hardware, que es transferido a una nueva arquitectura diferente ... – epatel

+0

@epatel Tengo clientes en PPC e Intel transfiriendo archivos de copia de seguridad CoreData a/desde un iPhone. Esta recomendación me habría causado dolor de cabeza si lo hubiera escuchado. Puedes construir el código ARM 6/7 para iPhone, no es exagerado pensar en binarios de grasa de 32/64 bits en el futuro. Este fue un comentario "ten cuidado", y recomiendo el método NSCoder que se menciona a continuación, es seguro para siempre no solo a corto plazo "durante algunos años". –

1

Con una estructura, creo que sería mejor crear una función que pueda codificar y decodificar la estructura, como cualquier objeto Objective-C.

Con enums, no estoy tan seguro. Los enumerados son solo números asociados con un nombre, así que simplemente enójelos y decodifíquelos como números.

4

usted debe tener una implementación personalizada de la NSCoding protocolo en tu clase personalizada. En sus propias implementaciones de -[initWithCoder:] y -[encodeWithCoder:], puede codificar/decodificar los objetos struct de la forma que desee.

En el camino para hacer esto sería llamar [coder encodeObject:[NSValue valueWithBytes:&yourStructVariable objCType:@encode(struct YourStructName)] forKey:@"someKey"]; en -[encodeWithCoder:] y hacer la descodificación equivalente en -[initWithCoder:].

Puede almacenar los objetos de clase como transformables en Datos básicos.

+1

El uso de NSValue valueWithBytes es lo que arroja la excepción mencionada por el OP. –

Cuestiones relacionadas