2009-09-16 10 views
7

Estoy tratando de importar un conjunto de datos a un almacén persistente CoreData. Se trata de datos de solo lectura que se presentarán al usuario en tiempo de ejecución.Problema de relación uno a varios de CoreData e inversa

Tengo una entidad llamada "Categoría" que tiene una relación de uno a muchos con una entidad llamada "Artículo", que a su vez tiene una relación inversa con una Categoría.

Cuando agrego elementos al contexto, ¿cómo los asocio con la categoría correcta? Puedo ver en el dB SQLite que se hace agregando un campo de Categoría a la tabla Item, y probablemente use la clave primaria de Categorías para la relación. Pero el PK está detrás de escena ... ¿hay algún método para hacer la conexión?

También veo en mi clase de Categoría de la existencia de medios generados por CoreData para añadir elementos, pero estoy asumiendo que estos son alos métodos detrás de la escena que permiten CoreData para mantener las relaciones:

@interface Category (CoreDataGeneratedAccessors) 

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

@end 

Leí en la guía de programación que CoreData se ocupa automáticamente del otro lado de la relación, pero no puedo entender cómo hacer el enlace inicial a una categoría cuando agrego elementos.

Gracias

jk

Respuesta

9

Hay diferentes posibilidades. Si ya tiene un objeto de categoría (por ejemplo obtenida a través de una petición de recuperación), y suponiendo que las variables

Category *category; 
Item *item; 

continuación, sólo tiene que hacer lo siguiente:

item.category = category; 

o

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

y listo, dado que Core Data establece automáticamente las relaciones inversas.

Si usted no tiene un objeto Categoría, o desea insertar uno nuevo, haga lo siguiente:

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

continuación, establece este objeto Categoría para su objeto Artículo exactamente igual que antes. Por último, los métodos que haya mostrado no se utilizan detrás de las escenas de datos básicos: estos métodos están disponibles para usted, por lo que también se puede hacer lo siguiente:

[category addItemObject:item]; 

o el inverso:

[item addCategoryObject:category]; 
+0

Gracias, sin perdón. Ya había descubierto la mayor parte de esto desde otra publicación en otra pizarra, pero tu respuesta es clara como una campana. ¡Los documentos de Wish Apples eran mejores! ¡Ahora necesito aprender cómo recuperar artículos para una categoría determinada y estoy en casa gratis! jk – Alpinista

+1

Necesita asociar un NSPredicate a la solicitud de búsqueda que utiliza para obtener objetos de la entidad Item. Si su entidad de Categoría almacena el nombre de la categoría como una propiedad, usa la relación de uno a uno de Elemento a Categoría: NSPredicate * predicate = [NSPredicate predicateWithFormat: @ "category.name LIKE% @", yourCategoryNameStringHere]; Simplemente asocie este predicado a la solicitud de búsqueda que usa para obtener objetos de la entidad Item. –

+1

Gracias de nuevo, Unforgiven. Descubrí que también puede ir desde la otra dirección: si tiene la Categoría, puede obtener una matriz de Elementos del NSSet de la propiedad Artículos de la categoría. – Alpinista

Cuestiones relacionadas