2011-12-22 15 views
5

Totalmente nuevo con Core Data, estoy haciendo mi modelo de datos. Tengo 33 entidades, y pocas relaciones difíciles entre ellas, pero muchas relaciones de clave foránea.Cómo representar las relaciones de clave externa en Core Data - Modelo de datos en XCode

¿Cómo puedo gestionar las relaciones que no son exactamente 1-many o 1-1 o many-many pero son claves foráneas en Core Data Model?

Por ejemplo, tengo una entidad de contacto, que tiene una relación con un contact_x_mail, y al mismo tiempo contact_x_mail tiene una relación con Mail, que contiene todos los correos electrónicos. Estas relaciones son 1-muchos o muchos-muchos. Pero hay otros como Institución (un contacto puede tener muchas Instituciones) y Correo, que no es una relación 1-muchos o 1-1, la Institución tiene ForeignKey_mail_id.

¿Cómo puedo representar esa relación de clave externa? Índices?

Muchas gracias, espero que mi pregunta sea clara.

+0

no estoy seguro de que realmente haya entendido. Si una relación no es 1-M, M-M o 1-1, ¿entonces qué es? – paulbailey

Respuesta

8

Usted está pensando en CoreData en términos de un DBMS que no lo es. No necesita configurar claves externas para establecer relaciones en CoreData. Si desea asignar un correo electrónico a un usuario, solo crea una relación entre los dos y puede establecer el atributo "correo electrónico" de un usuario o el atributo "usuario" de un correo electrónico. La clave externa y los enlaces están hechos por CoreData en segundo plano.

En otro punto, cada relación es, por definición, 1-1, 1- * o -. No estoy seguro de que haya otra opción ...

Cuando crea relaciones en CoreData, está creando efectivamente nuevos atributos para este elemento. Aquí está un ejemplo:

@interface User : NSManagedObject 

#pragma mark - Attributes 
@property (nonatomic, strong) NSString *name; 
@property (nonatomic, strong) NSString *emailAddress; 

#pragma mark - Relationships 
//All to-many relationships are saved as Sets. You can add to the "emails" relationship attribute to add email objects 
@property (nonatomic, strong) NSSet  *emails; 
//All to-one relationships are saved as types of NSManagedObject or the subclass; in this case "Institution" 
@property (nonatomic, strong) Institution *institution; 

La configuración de estos es tan simple como:

User *user = [NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:[self.fetchedResultsController managedObjectContext]]; 
[user setName:@"Matt"]; 
[user setEmailAddress:@"[email protected]"]; 

//...Maybe i need to query my institution 
NSFetchRequest *query = [[NSFetchRequest alloc] initWithEntityName:@"Institution"]; 
    [bcQuery setPredicate:[NSPredicate predicateWithFormat:@"id == %@",  institutionId]]; 
    NSArray *queryResults = [context executeFetchRequest:query error:&error]; 
[user setInstitution:[queryResults objectForId:0]]; 

//Now the user adds a email so i create it like the User one, I add the proper 
//attributes and to set it to the user i can actually set either end of the 
//relationship 
Email *email = ... 
[email setUser:user]; 

//Here i set the user to the email so the email is now in the user's set of emails 
//I could also go the other way and add the email to the set of user instead. 

Espero que esto ayude a aclarar las cosas un poco! ¡Lea sobre la documentación para asegurarse de que CoreData sea adecuado para usted!

http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/CoreData.pdf

Cuestiones relacionadas