2012-06-12 11 views
7

In questo progetto Core Data di test, ho una relazione uno a molti da "Cliente" a "Prodotti" e questa relazione è denominata "prodotti". L'attributo del cliente è "nome" e l'attributo del prodotto è "oggetto". Ho sottoclasse entità e Xcode ha prodotto il seguente per il Cliente:Come utilizzare i metodi di accesso add & remove (NSSet) dei dati di base?

@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 

Per aggiungere, diciamo, un cliente (John Doe) e due elementi (Widget 1 & Widget 2), posso usare la funzione di accesso metodo addProductsObject come segue:

... 
// 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]; 
} 
... 

Questo funziona bene, ma, se possibile, mi piacerebbe fare uso dei addProducts ac sore.

sto supponendo che la funzione di accesso generato metodo addProducts è lì per facilitare l'inserimento di un 'set' di oggetti con qualcosa come:

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

ma questo fallisce. In questo tentativo, comprendo che un oggetto prodotto non è stato creato in modo esplicito e, come tale, non è stata effettuata un'assegnazione esplicita del prodotto, ma ho pensato, forse, che l'accessor si sarebbe occupata di ciò.

cosa, quindi, è l'uso corretto di addProducts, e se è per questo, removeProducts?

Grazie.

risposta

13

Il set che si sta passando per aggiungere prodotti contiene NSString, non prodotti.

NSMutableSet* products = [NSMutableSet set]; 

Products* product = [NSEntityDescription insertNewObjectForEntityForName: @"Products" inManagedObjectContext: context]; 
product.item = @"Widget 1"; 
[products addObject: product]; 

product = [NSEntityDescription insertNewObjectForEntityForName: @"Products" inManagedObjectContext: context]; 
product.item = @"Widget 2"; 
[products addObject: product]; 

[customer addProducts: products]; 

Di per sé, la funzione di accesso non hanno modo di sapere quali sono le corde hai dato al primo posto erano per. Devi fornire un set contenente il giusto tipo di entità.

Detto questo, è possibile definire il proprio accessor, prendere una serie di stringhe e inserire prodotti correttamente inizializzati nella relazione: addProductsWithStrings: ad esempio.