2009-06-02 24 views
7

Estoy seguro de que esta debe ser una pregunta estúpida, pero he rastreado los interwebbings y no puedo encontrar la respuesta. Muchas personas hablan sobre el uso del patrón Generation Gap, en el cual usted tiene una subclase NSManagedObject que se genera a partir de su modelo, y luego la subclase para agregar propiedades y comportamientos transitorios. El beneficio de esto es que si cambia su modelo persistente, puede simplemente generar sus archivos base nuevamente sin ningún peligro de sobreescribir su propio código.CoreData - cómo crear una subclase de una subclase de NSManagedObject (patrón Generation Gap)

Tengo un objeto CardMO base derivado de NSManagedObject. A continuación, hago una subclase para hacer mi propio objeto Card.

Mi pregunta es, ¿cómo creo un objeto de tarjeta que se administre?

me trataron:

Card* card = [NSEntityDescription insertNewObjectForEntityForName:@"CardMO" inManagedObjectContext:moc]; 

Pero este objeto no es realmente una tarjeta, y por supuesto hay una excepción cuando voy a llamar a un método de tarjeta en este objeto.

He intentado crear una tarjeta con alloc/init (init, donde sólo llama [súper init]), y después de añadir a la managedObjectContext así:

[moc insertObject:(CardMO*)card]; 

Esto me da el error críptico " No se ha podido llamar inicializador designado en clase 'tarjeta' NSManagedObject"

he intentado modificar esta llamando [NSEntityDescription insertNewObjectForEntityForName: @ "inManagedObjectContext CardMO": [AIStoreManager sharedAIStoreManager] .managedObjectContext] en lugar de [súper init]. En este caso, el objeto que recibo vuelve a ser un CardMO y no puedo llamar a los métodos de la Tarjeta.

¿Qué debería estar haciendo?

Y (para puntos de bonificación :-) - después de haber superado este obstáculo, necesito crear mis otros objetos de tarjeta desde XML, y luego convertirlos en NSManagedObjects. Estoy usando código basado en XMLReaderSAX de Apple. Le doy a este código una porción de XML y me devuelve una gran variedad de objetos de la Tarjeta. ¿Puedo agregar más adelante estos objetos a mi contexto de objeto administrado, o tengo que entrar en XMLReaderSAX y cambiar cómo crea esos objetos?

Estoy escribiendo una aplicación para iPhone en 3.0, pero supongo que esto es lo mismo para Core Data para 10.5.

Respuesta

8

Sussed it!

En el modelo de datos, el nombre de clase para la entidad tiene que ser el de la clase más derivada - Tarjeta en mi caso. El problema entonces es que debe recordar cambiar el nombre a CardMO antes de generar cualquier archivo nuevo.

Esto debe ser por qué las personas usan mogenerator.

+0

Para hacer que el objeto gestionado del analizador sintáctico, tuve que entrar en el código derivado de Apple y cambiar el código de creación de objeto para que se vea como el anterior. Funcionó bien –

0

¿Por qué no utilizar NSCoding? Entonces podría soportar XML o JSON o cualquier otro medio para describir el objeto fuera de su aplicación.

Cuestiones relacionadas