2012-02-11 8 views
10

Tengo una subclase de NSManagedObject, y me gustaría agregar un par de ivars para mantener un registro de algunas contabilidad. No quiero que estos vars persistan, y es por eso que no los incluyo como parte del modelo de datos.agregando variables no persistentes a nsmangedobject

Tengo problemas para encontrar la forma correcta de hacerlo.

  • ¿Debería crear ivars en mi clase, crear la propiedad correspondiente y luego sintetizarlos en la implementación?
  • ¿No debería crear ivars, y en su lugar solo declarar la propiedad y luego @dynamic la propiedad en la implementación?
  • ¿Hay algún otro enfoque que debería tomar?

Y debería hacer toda la personalización en la subclase mi NSManagedObject, o debería ser la creación de una subclase de mi subclase, de manera que si cambio de modelo de datos no voy a perder todos mis personalizaciones cuando llegue xcode para generar mi subclase NSManagedObject de forma automática?

Gracias!

Respuesta

9

Cada atributo para NSManagedObject tiene una casilla con el nombre transient. De esta manera, tendrá accesadores dinámicos para el objeto sin que realmente persista el valor de la propiedad en sí. Busque la casilla de verificación justo debajo del campo de texto para ingresar el nombre del atributo.

enter image description here

ACTUALIZACIÓN Si no desea crear una migración debido a los nuevos atributos, hacer Ivars estándar

@interface MyMO : NSManagedObject { 
    NSString *_nonPersistentAttribute; 
} 

@property (nonatomic, retain) NSString *nonPersistentAttribute; 

@end 

@implementation MyMO 

@synthesize nonPersistentAttribute=_nonPersistentAttribute; 

@end 
+0

haciendo modificaciones a atributos transitorios marcará NSManagedObject como sucio. ¿Hay alguna forma preferida de agregar más vars sin hacer que el objeto crea que necesita ser re-guardado? Y no necesito deshacer el soporte. Gracias –

+0

Luego solo agregue iVars de la manera habitual y '@ synthesize' los accesadores. – Eimantas

+0

Gracias por sugerir dos alternativas. He utilizado con éxito el segundo una vez, pero ahora solo recibo la excepción "selector no reconocido enviado a instancia" cada vez que intento acceder a la propiedad transitoria. ¿Alguna idea? –

1

Aquí es un patrón conveniente que han utilizado en el pasado:

Cree una categoría de su clase y colóquela en un archivo fuente adicional, como ManagedObject+Support.h. Recuerde, en la declaración de interfaz que acaba de utilizar soportes como esto:

@interface ManagedObject (Support) 
// declare your variables and methods 
@end 

De esta manera, se puede cambiar las cosas sin tener que modificar su modelo de objeto gestionado. (El cambio de MOM tiene muchos problemas con las bases de datos repobladas, la migración, etc.). Cuando cambia el modelo, puede generar los archivos de clase nuevamente sin perder el código en la categoría.

2

Wise,

a su primera pregunta re: Ivars, tienes dos opciones Ivars estándar o atributos transitorios en su entidad. La gran diferencia entre los dos es que los atributos transitorios participan en los aspectos de cambio/sucia/deshacer de los datos centrales. Si tus ivars no necesitan eso, entonces no uses los atributos transitorios. (Sí, use @property y @synthesize para sus ivars.)

Para su segunda pregunta re: dónde hacer los cambios? Soy un poco ludita. Los patrones de encabezado generados automáticamente por Xcode son bastante simples. Por lo tanto, utilizo los archivos generados automáticamente por primera vez que creo una entidad y edito en mis cambios posteriores. Francamente, no cambia las estructuras de datos de su modelo muy a menudo. Por lo tanto, agregar algunas líneas aquí y allá a ambos .h & .m archivos no es un gran costo. Hay otros mecanismos. El sistema mogenerator de Wolf Rentzch es muy respetado y útil.Dicho esto, no estoy convencido de que Mogenerator resuelva un problema al que se enfrentan los programadores Objective-C v2 Core Data modernos. (Obj-C v2 ha hecho muchas cosas más fácil para los programadores de Datos Básicos.)

Andrew

10

La documentación para NSManagedObject tiene una sección llamada variables de instancia personalizada. Discute ambos enfoques.

Tanto los atributos moderados transitorios como los ivars son buenas soluciones. Depende del gusto y el estilo.

Una punto muy importante para recordar si utiliza Ivars: Es necesario borrar a cabo en Ivars - (void)didTurnIntoFault y establece valores iniciales en - (void)awakeFromFetch y - (void)awakeFromInsert. Necesita no tocar cualquier atributo o relación modelada dentro de -didTurnIntoFault o de lo contrario tendrá problemas.

Cuestiones relacionadas