2009-10-16 15 views
6

He configurado un modelo de Datos centrales donde tengo dos objetos, por ejemplo Persona y Dirección. Una persona tiene una dirección y una dirección puede pertenecer a muchas personas. Lo he modelado en datos básicos como tal (por lo que la flecha doble apunta a Persona, mientras que la flecha simple va a Dirección)Core Data devuelve NSManagedObject en lugar de la clase Concrete, pero solo cuando se usa. accesor

He creado dos clases para esos objetos e implementado algunos métodos personalizados en esas clases. En el modelo de Datos básicos, he introducido los nombres de las clases en ellos.

Si obtengo una Dirección de Datos centrales directamente, me da la clase concreta real y puedo llamar a mis métodos personalizados en ella.

Si, por otro lado, busco una Persona e intento acceder a la Dirección a través de Persona (por ejemplo: dirección.persona) obtengo un NSManagedObject que es una dirección (por ejemplo: puedo acceder a todos los atributos de datos básicos I 's establecido en él) pero no responde a mis métodos personalizados, porque es del tipo NSManagedObject en lugar de la dirección. ¿Es esto una limitación de Core Data o estoy haciendo algo mal? Si se trata de una limitación, ¿hay algún problema?

+0

No es una limitación de Core Data; ciertamente estás haciendo algo mal. ¿A qué se refiere exactamente con "no responde a mis métodos personalizados, porque es del tipo NSManagedObject en lugar de Address"? ¿Obtiene una excepción de selector no reconocido? ¿Se queja el compilador? Muéstranos algunos códigos y resultados o será difícil diagnosticar el problema. –

+0

Por lo tanto, se trata de un error de tiempo de ejecución (no del compilador), de que NSManagedObject no responde al nombre de mi método personalizado. El mismo error que obtienes cuando no especificas el nombre de tu clase en el modelador de datos básicos. – rustyshelf

Respuesta

9

¿Creó esas clases utilizando el modelador (Seleccione una Entidad, Archivo> nuevo archivo ..., Clase de Objeto Administrado, luego seleccione la Entidad Modelo)?

Hace un tiempo tuve un problema similar porque no creé mis modelos de objetos gestionados utilizando el Modeller. Lo que hice para asegurarme de que todo estaba funcionando fue copiar y guardar mis métodos personalizados (y todo lo demás que había implementado) y comenzar de cero con el modelador. Luego pude personalizar mis clases modelo nuevamente y todo funcionó bien.

Sé que esta no es una respuesta completa, pero quizás pueda ayudarlo hasta que alguien explique exactamente lo que está sucediendo.

¡Salud!

+0

Gracias por la sugerencia, lo intenté con solo una entidad, pero lo haré con todos ellos y veré si hace alguna diferencia – rustyshelf

+0

¡Eso funcionó! Los recreé todos del modelo, agregué mi código personalizado nuevamente y BAM fue feliz. Extraño.Realmente no puedo ver ninguna diferencia obvia aparte de los métodos extra que generó que no tuve ... – rustyshelf

6

Probablemente se olvidó de establecer el nombre de la clase en el modelo cuando creó la entidad - de forma predeterminada es NSManagedObject. Haga clic en Persona y dirección en el modelador y compruebe, en el extremo derecho donde se enumeran las propiedades de la Entidad, que el campo Clase se completa correctamente con el nombre de la clase C objetivo correspondiente y no es solo la configuración NSManagedObject predeterminada.

+0

No, definitivamente los he configurado, por lo tanto, ¿por qué funciona si obtengo un objeto de ese tipo directamente de los datos centrales? – rustyshelf

+0

En realidad, recuperar un objeto funcionará independientemente de si la clase de la entidad está configurada como NSManagerObject o no. Pero, como señala @ Terry Longrie, para los métodos personalizados de un managedObject que se va a llamar, la clase de la entidad debe establecerse explícitamente a Person o Address o lo que sea. Cuando crea la clase personalizada utilizando el modelador como lo sugirió @Lio, esto se hace automáticamente por usted. Cuando crea la clase personalizada a mano, por así decirlo, también necesita especificar la clase a mano. Perdí algunas horas de mi vida averiguando eso. –

1

Su archivo de implementación para la clase probablemente no se haya agregado al Target que está ejecutando.

(Obtener información en el archivo .m -> Comprobar la pestaña objetivos)

Si su xcdatamodel tiene el conjunto de la clase, si no lo encuentra en tiempo de ejecución seguirá siendo el trabajo, se le acaba de obtener Instancias de NSManagedObject en su lugar. Lo cual realmente funcionará bien, hasta que intentes agregar otro método a la clase, como lo has encontrado.

+0

Este fue el problema en mi caso – Jan

Cuestiones relacionadas