2009-05-11 17 views
9

Ho un'applicazione scritta utilizzando i dati principali. Ho 2 entità con una relazione uno-a-molti. Ho sottoclassato NSManagedObject per entrambi. L'entità su un lato è chiamata Playlist e l'altro è chiamato Song.Dichiarazione di proprietà per più relazioni nei dati principali

L'interfaccia per brani:

@interface VBPlaylist : NSManagedObject { 
} 

@property (readwrite, copy) NSString *name; 

@end 

L'implementazione di brani:

@implementation VBPlaylist 

@dynamic name; 

@end 

penso che dovrei avere un'altra proprietà per indicare le canzoni sotto la classe Playlist. Non riesco a trovare alcun codice di esempio che mostri molte relazioni scritte come proprietà. Come fai a fare questo?

+0

Inoltre, dai un'occhiata a [questo post del blog] (http://nvie.com/archives/263 "Genera automaticamente le classi per il tuo modello di dati Core Data") per la generazione di classi ** estremamente automatica ** automatica . – nvie

risposta

18

Le relazioni di uno sono modellate come riferimenti di oggetto da Core Data. Quindi, una relazione a uno da Entità Bar all'entità Baz (assumendo Baz è implementato dalla classe Baz) sarebbe

@interface Bar : NSManagedObject { 
} 

@property (readwrite,nonatomic) Baz * toBaz; 

@end 

a-molti sono modellati come un insieme di proprietà mutabile (anche se non come NSMutableSet). Ipotizzando un rapporto a-molti da Bar a Baz chiamato 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 

Se si desidera utilizzare l'interfaccia NSMutableSet di manipolare il rapporto manyBazz, si dovrebbe chiamare -mutableSetValueForKey:@"manyBazz" per ottenere un proxy KVO-compliant per la relazione manyBazz.

Su Leopard (OS X 10.5) e versioni successive, tutti i metodi appropriati vengono generati automaticamente in fase di esecuzione dal framework Core Data, anche se non vengono dichiarati esplicitamente o implementati (si otterrà, ovviamente, un compilatore avviso se si tenta di usarli senza dichiararli in un file di intestazione). In questo modo non necessità sottoclasse

Il modo più semplice per ottenere la dichiarazione e l'attuazione a destra è quello di selezionare gli attributi nel modellatore di dati e scegliere "Copia Objective-C 2.0 Dichiarazioni metodo per Clipboard" dal "Design- > Modello di dati "menu, l'incolla nel file .h di classi di implementazione. Ovviamente, devi mantenere il tuo .h e il modello in sincrono ... quindi una raccomandazione calorosa per il fantastico MO Generator di rentzsch, uno strumento che genera automaticamente (e ri-genera) sottoclassi NSManagedObject dal tuo modello dati.

+0

Quindi, in questo caso, se voglio aggiungere un oggetto Baz a Bar, posso fare: [barInstance addManyBazzObject: bazInstance] o bazInstance.bar = barInstance? – hekevintran

+0

Sì, è corretto. –

+0

Penso che ti sia dimenticato di finire quell'ultima frase. –

16

Il modo più semplice per creare file .he .m per le entità CoreData è questo:

  1. selezionare un'entità nel modellatore di dati.
  2. Premere Comando-N o selezionare File-> Nuovo file ...
  3. Selezionare 'Cocoa' dall'elenco sorgente.
  4. Nel selettore modello, ora dovresti vedere un oggetto chiamato "Classe oggetto gestito". Se questo non è presente, fai clic su Annulla e ripeti i passaggi 1-2.
  5. Premere Succ., Selezionare il progetto/destinazione, quindi premere di nuovo Avanti.
  6. Ora si vede qualcosa come la seguente finestra: New Managed Object Class window http://blog.alanquatermain.net/images/ManagedObjectClass.png
  7. Selezionare le opzioni necessarie e fare clic su Fine.

Questo genererà la seguente intestazione e file sorgente:

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 che l'attuazione non contiene qualsiasi cosa eccetto i marcatori @dynamic per dire al compilatore di non preoccuparsi della mancanza di metodi/variabili per abbinare le proprietà.

+0

Fresco. Il codice generato è un buon esempio su come impostarlo. L'ho usato molto oggi. –

2

Questo è leggermente cambiato. A partire dal 4.2.1 (marzo 2012), si passa a Nuovo file; selezionare Dati principali (non Cocoa), quindi selezionare Nuova sottoclasse NSObjectModel. Da lì produce la sottoclasse come descritto sopra.

+0

Inoltre, 'CMD + N' invece di file-> nuovo –

Problemi correlati