2012-06-12 9 views
7

In diesem Test Core Data-Projekt habe ich eine Eins-zu-viele-Beziehung von "Kunde" zu "Produkte" und diese Beziehung heißt "Produkte". Das Attribut des Kunden ist "Name" und das Attribut des Produkts ist "Element". Ich habe die Entitäten subclassed und Xcode hat folgende für den Kunden produziert:Wie Verwenden von Core-Daten hinzufügen und entfernen (NSSet) Accessor-Methoden?

@interface Customer : NSManagedObject 

@property (nonatomic, retain) NSString * name; 
@property (nonatomic, retain) NSSet *products; 
@end 

@interface Customer (CoreDataGeneratedAccessors) 

- (void)addProductsObject:(Products *)value; 
- (void)removeProductsObject:(Products *)value; 
- (void)addProducts:(NSSet *)values; 
- (void)removeProducts:(NSSet *)values; 

@end 

hinzuzufügen, sagen wir mal, ein Kunde (John Doe) und zwei Elemente (Widget 1 & Widget 2), kann ich die Accessor verwenden Verfahren addProductsObject wie folgt:

... 
// Add (1) customer object 
Customer *custObj = [NSEntityDescription insertNewObjectForEntityForName:[entity name] inManagedObjectContext:context]; 
[custObj setValue:@"John Doe" forKey:@"name"]; 

// Add (2) products for John Doe 
for (int foo=0; foo<2; foo++) { 
    self.product = [NSEntityDescription insertNewObjectForEntityForName:@"Products" inManagedObjectContext:context]; 
    NSString *objString = [NSString stringWithFormat:@"Widget %d", foo]; 
    self.product.item = objString; 
    [custObj addProductsObject:self.product]; 
} 
... 

Dies funktioniert aber, wenn möglich, ich Nutzung der addProducts ac machen möchten Abgeordnete.

Ich gehe davon aus, dass das Verfahren erzeugt Accessor addProducts ist die Einfügung eines ‚Set‘ von Objekten mit so etwas wie zu erleichtern:

... 
NSSet *itemSet = [[NSSet alloc] initWithObjects:@"Widget 1", @"Widget 2", nil]; 
[custObj addProducts:itemSet]; 
... 

aber dieser scheitert. Bei diesem Versuch verstehe ich, dass ein Produktobjekt nicht explizit erstellt wurde und somit keine explizite Produktzuordnung stattgefunden hat, aber ich dachte, der Accessor würde sich darum kümmern. daher

Was ist die korrekte Verwendung von addProducts, und was das betrifft, removeProducts?

Danke.

Antwort

13

Die Menge, die Sie an addProducts übergeben, enthält NSString, nicht Products.

Per se hat der Accessor keine Möglichkeit zu wissen, wofür die Strings, die Sie ihm an erster Stelle gaben, waren. Sie müssen ein Set bereitstellen, das die richtige Art von Entitäten enthält.

Das heißt, Sie können Ihren eigenen Accessor definieren, eine Reihe von Zeichenfolgen nehmen und richtig initialisierte Produkte in Ihre Beziehung einfügen: addProductsWithStrings: per example.