2009-09-16 9 views
7

Sto tentando di importare un set di dati in un persistentStore CoreData. Si tratta di dati di sola lettura che verranno presentati all'utente in fase di esecuzione.CoreData problema di relazione uno-a-molti e inversa

Ho un'entità chiamata "Categoria" che ha una relazione uno-a-molti con un'entità chiamata "Elemento", che a sua volta ha una relazione inversa con una Categoria.

Come aggiungo elementi al contesto, come li associo alla categoria corretta? Posso vedere in SQLite dB che è fatto aggiungendo un campo Category alla tabella Item e probabilmente usa la chiave primaria Categories per la relazione. Ma il PK è dietro le quinte ... c'è un metodo per fare la connessione?

vedo anche nella mia classe Categoria che ci sono metodi generati da CoreData per l'aggiunta di elementi, ma io parto dal presupposto che questi sono Alos metodi dietro le quinte che permettono CoreData di mantenere le relazioni:

@interface Category (CoreDataGeneratedAccessors) 

- (void)addItemObject:(Item *)value; 
- (void)removeItemObject:(Item *)value; 
- (void)addItems:(NSSet *)value; 
- (void)removeItems:(NSSet *)value; 

@end 

Ho letto nella guida alla programmazione che CoreData si occupa automaticamente dell'altro lato della relazione, ma non riesco a capire come si fa il collegamento iniziale a una categoria mentre aggiungo articoli.

Grazie

jk

risposta

9

Ci sono diverse possibilità. Se si dispone già di un oggetto di categoria (per esempio ottenuto attraverso un recupero richiesta), e assumendo le variabili

Category *category; 
Item *item; 

allora è sufficiente effettuare le seguenti operazioni:

item.category = category; 

o

[category setValue: category forKey:@"category"]; 

e il gioco è fatto, poiché Core Data imposta automaticamente le relazioni inverse.

Se non si dispone di un oggetto di categoria, o si desidera inserire uno nuovo, effettuare le seguenti operazioni:

// Create a new instance of the entity 
Category *category = (Category *) [NSEntityDescription insertNewObjectForEntityForName:@"Category" inManagedObjectContext:managedObjectContext]; 
// add all of the category properties, then set the relationship 
// for instance set the category name 
[category setValue:@"myCategoryName" forKey:@"name"]; 
[category setValue:item forKey:@"item"]; 

Poi si imposta questo oggetto Categoria per l'oggetto Oggetto esattamente come prima. Infine, i metodi che avete presenti sul sito non sono utilizzati dietro le quinte da Core Data: questi metodi sono disponibili per voi, in modo che si può anche effettuare le seguenti operazioni:

[category addItemObject:item]; 

o l'inverso:

[item addCategoryObject:category]; 
+0

Grazie, spietato. Ne avevo già tratto la maggior parte da un altro post su un'altra bacheca, ma la tua risposta è chiara come una campana. I documenti di Wish Mele erano migliori! Ora ho bisogno di imparare come recuperare gli oggetti per una determinata categoria e sono a casa gratis! jk – Alpinista

+1

È necessario associare un NSPredicate alla richiesta di recupero che si utilizza per recuperare oggetti dall'entità Articolo. Se l'entità di categoria memorizza il nome della categoria come proprietà, si utilizza la relazione di persona da articolo a categoria: NSPredicate * predicate = [NSPredicate predicateWithFormat: @ "category.name LIKE% @", yourCategoryNameStringHere]; Basta associare questo predicato alla richiesta di recupero che si utilizza per recuperare oggetti dall'entità Articolo. –

+1

Grazie ancora, Spietato. Ho scoperto che puoi anche andare dall'altra direzione: se hai la categoria, puoi ottenere una serie di articoli dall'NSSet della proprietà Items della categoria. – Alpinista

Problemi correlati