2009-05-11 19 views
9

Tengo una aplicación escrita usando Core Data. Tengo 2 entidades con una relación de uno a muchos. He subclase NSManagedObject para ambos. La entidad en un lado se llama lista de reproducción y la otra se llama canción.Declaración de propiedad para muchas relaciones en Core Data

La interfaz para la reproducción:

@interface VBPlaylist : NSManagedObject { 
} 

@property (readwrite, copy) NSString *name; 

@end 

La aplicación de reproducción:

@implementation VBPlaylist 

@dynamic name; 

@end 

creo que debería tener otra propiedad para indicar las canciones bajo la clase de lista de reproducción. No puedo encontrar ningún código de muestra que muestre muchas relaciones escritas como propiedades. ¿Cómo haces esto?

+0

Además, eche un vistazo a [esta publicación en el blog] (http://nvie.com/archives/263 "Genere clases automáticamente para su modelo de datos Core Data") para una generación ** automática ** extremadamente fácil de las clases . – nvie

Respuesta

18

Las relaciones de uno a uno se modelan como referencias de objeto por Core Data. Así que una relación a uno de Entidad Bar a entidad Baz (suponiendo Baz es implementado por la clase Baz) sería

@interface Bar : NSManagedObject { 
} 

@property (readwrite,nonatomic) Baz * toBaz; 

@end 

relaciones A-Muchos se modelan como una propiedad conjunto mutable (aunque no como NSMutableSet) Suponiendo una relación a muchos de Bar a Baz llamada manyBazz:

@interface Bar : NSManagedObject { 

} 

@property (retain) NSSet* manyBazz; 

@end 

// coalesce these into one @interface AnalysisRecord (CoreDataGeneratedAccessors) section 
@interface Bar (CoreDataGeneratedAccessors) 
- (void)addManyBazzObject:(Baz *)value; 
- (void)removeManyBazzObject:(Baz *)value; 
- (void)addManyBazz:(NSSet *)value; 
- (void)removeManyBazz:(NSSet *)value; 

@end 

Si desea utilizar la interfaz NSMutableSet para manipular la relación manyBazz, debe llamar -mutableSetValueForKey:@"manyBazz" para obtener un proxy de MVA-compatible para la relación manyBazz.

En Leopard (OS X 10.5) y más tarde, todos los métodos apropiados se generan automáticamente en tiempo de ejecución por el marco de Core Data, incluso si no los declara explícitamente o los implementa (obtendrá, por supuesto, un compilador advertencia si intenta usarlos sin declararlos en un archivo de encabezado). Por lo tanto usted no necesidad subclase

La forma más sencilla de obtener la declaración y aplicación correcta es seleccionar los atributos en el modelador de datos y elegir la opción "Copia de Objective-C 2.0 Declaraciones método para portapapeles" del "Design- > Menú "Modelo de datos", pegue en su archivo .h de implementación de clases. Por supuesto, tienes que mantener tu .h y tu modelo sincronizados ... de ahí una recomendación sincera para la increíble MO Generator de rentzsch, una herramienta que automáticamente generará (y re generará) subclases NSManagedObject de tu modelo de datos.

+0

Entonces, en este caso, si deseo agregar un objeto Baz a la Barra, puedo hacer lo siguiente: [barInstance addManyBazzObject: bazInstance] o bazInstance.bar = barInstance? – hekevintran

+0

Sí, eso es correcto. –

+0

Creo que se olvidó de terminar esa última oración. –

16

La forma más sencilla de crear .hy archivos .m para sus entidades CoreData es la siguiente:

  1. Seleccione una entidad en el modelador de datos.
  2. Presione Comando-N o seleccione Archivo-> Nuevo archivo ...
  3. Seleccione 'Cacao' en la lista de fuentes.
  4. En el selector de plantillas, ahora debería ver un elemento llamado 'Clase de objeto gestionado'. Si esto no está allí, haga clic en Cancelar y repita los pasos 1-2.
  5. Presione Siguiente, elija el proyecto/destino, y presione Siguiente nuevamente.
  6. Ahora verá algo como la siguiente ventana: New Managed Object Class window http://blog.alanquatermain.net/images/ManagedObjectClass.png
  7. Seleccione las opciones que necesita y haga clic en Finalizar.

Esto generará el siguiente encabezado y archivos de origen:

Entity.h:

#import <CoreData/CoreData.h> 


@interface Entity : NSManagedObject 
{ 
} 

@property (retain) NSNumber * uniqueID; 
@property (retain) NSString * name; 
@property (retain) Entity * parent; 
@property (retain) NSSet* children; 

@end 

@interface Entity (CoreDataGeneratedAccessors) 
- (void)addChildrenObject:(Entity *)value; 
- (void)removeChildrenObject:(Entity *)value; 
- (void)addChildren:(NSSet *)value; 
- (void)removeChildren:(NSSet *)value; 

@end 

Entity.m:

#import "Entity.h" 


@implementation Entity 

@dynamic uniqueID; 
@dynamic name; 
@dynamic parent; 
@dynamic children; 

@end 

nota de que la aplicación no contiene cualquier cosa, excepto @dynamic marcadores para decirle al compilador que no se preocupe por la falta de métodos/variables para hacer coincidir las propiedades.

+0

Cool. El código generado es un buen ejemplo de cómo configurar esto. Lo he estado usando mucho hoy. –

2

Esto ha cambiado ligeramente. A partir del 4.2.1 (marzo de 2012), vas a Nuevo archivo; seleccione Datos principales (no Cocoa), y luego seleccione Nueva subclase NSObjectModel. A partir de ahí produce la subclase como se describió anteriormente.

+0

Además, 'CMD + N' en lugar de file-> new –

Cuestiones relacionadas