2012-06-12 16 views
7

En este proyecto de prueba Core Data, tengo una relación de uno a muchos desde "Cliente" hasta "Productos" y esta relación se denomina 'productos'. El atributo del cliente es 'nombre' y el atributo del producto es 'artículo'. He subclases las entidades y Xcode ha producido la siguiente para el cliente:Cómo usar los métodos de acceso add & remove (NSSet) de Core Data?

@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 

Para agregar, digamos, un cliente (John Doe) y dos elementos (Widget 1 & Widget 2), puedo usar el descriptor de acceso método addProductsObject de la siguiente manera:

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

Esto funciona bien, pero, si es posible, me gustaría hacer uso de los addProducts ac Cessor.

Estoy asumiendo que el descriptor de acceso generado método addProducts está ahí para facilitar la inserción de un 'conjunto' de los objetos con algo como:

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

pero esto no funciona. En este intento, entiendo que un objeto del producto no se ha creado explícitamente y, como tal, no se ha realizado una asignación explícita del producto, pero pensé que tal vez el programa de acceso se ocupara de eso.

Lo que, por lo tanto, es el uso correcto de addProducts, y para el caso, removeProducts?

Gracias.

Respuesta

13

El conjunto que está pasando a addProducts contiene NSString, no Productos.

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

per se, el descriptor de acceso no tienen manera de saber cuáles son las cadenas que lo dio en primer lugar eran. Debe proporcionar un conjunto que contenga el tipo correcto de entidades.

Dicho esto, puede definir su propio acceso, tomando un conjunto de cadenas e insertando productos correctamente inicializados en su relación: addProductsWithStrings: por ejemplo.

Cuestiones relacionadas