2009-09-16 5 views
7

Ich versuche, eine Reihe von Daten in einen CoreData-persistentenStore zu importieren. Dies sind schreibgeschützte Daten, die dem Benutzer zur Laufzeit angezeigt werden.CoreData Eins-zu-viele und inverse Beziehungsproblem

Ich habe eine Entität namens "Category", die eine Eins-zu-viele-Beziehung mit einer Entität namens "Item" hat, die wiederum eine inverse Beziehung zu einer Kategorie hat.

Wenn ich Elemente zum Kontext hinzufüge, wie verknüpfe ich sie mit der richtigen Kategorie? Ich kann in der SQLite dB sehen, dass es getan wird, indem ich ein Kategoriefeld der Item-Tabelle hinzufüge und wahrscheinlich den Primärschlüssel Kategorien für die Beziehung verwendet. Aber die PK ist hinter den Kulissen ... Gibt es eine Methode, um die Verbindung herzustellen?

ich auch in meiner Kategorie Klasse sehe, dass es Methoden, die von Coredata erzeugt sind für Artikel hinzufügen, aber ich gehe davon aus, dass diese alos hinter den Kulissen Methoden, die Coredata ermöglichen, die Beziehungen zu pflegen:

@interface Category (CoreDataGeneratedAccessors) 

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

@end 

Ich las im Programmierhandbuch, dass CoreData automatisch die andere Seite der Beziehung behandelt, aber ich kann nicht herausfinden, wie die erste Verknüpfung zu einer Kategorie funktioniert, wenn ich Items hinzufüge.

Dank

jk

Antwort

9

Es gibt verschiedene Möglichkeiten. Wenn Sie bereits ein Category-Objekt haben (zum Beispiel durch eine Abrufanforderung erhalten wird), und unter der Annahme, die Variablen

Category *category; 
Item *item; 

dann tun Sie einfach das folgende:

item.category = category; 

oder

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

und Sie sind fertig, da Core Data automatisch die umgekehrten Beziehungen einstellt.

Wenn Sie keine Kategorie Objekt haben, oder Sie wollen ein neues einzufügen, gehen Sie wie folgt vor:

// 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"]; 

Dann setzen Sie diese Kategorie Objekt für Item-Objekt genau wie zuvor. Schließlich sind die Methoden, die Sie gezeigt haben, sind hinter den Kulissen von Core Data nicht verwendet: diese Methoden stehen Ihnen zur Verfügung, so dass Sie auch die folgenden Aktionen durchführen:

[category addItemObject:item]; 

oder der inversen:

[item addCategoryObject:category]; 
+0

Danke, unforgiven. Ich hatte das meiste bereits von einem anderen Beitrag auf einem anderen Brett herausgefunden, aber deine Antwort ist klar wie eine Glocke. Wish Apples Docs waren besser! Jetzt muss ich lernen, wie man Elemente für eine bestimmte Kategorie abruft, und ich bin zu Hause frei! jk – Alpinista

+1

Sie müssen der Abrufanforderung, die Sie zum Abrufen von Objekten aus der Element-Entität verwenden, ein NSPredikat zuordnen. Wenn Ihre Category-Entität den Namen der Kategorie als Eigenschaft speichert, verwenden Sie die To-One-Beziehung von Element zu Kategorie: NSPredicate * Prädikat = [NSPredicate-PrädikatWithFormat: @ "Kategorie.Name LIKE% @", IhreKategorieNameStringHere]; Ordnen Sie dieses Prädikat einfach der Abrufanforderung zu, die Sie zum Abrufen von Objekten aus der Entität Element verwenden. –

+1

Danke nochmal, Unforgiven. Ich entdeckte, dass Sie auch aus der anderen Richtung gehen können: Wenn Sie die Kategorie haben, können Sie ein Array von Items aus dem NSSet der Items-Eigenschaft der Categorie erhalten. – Alpinista