Как представить отношения внешнего ключа в базовых данных - модель данных в XCode
Совершенно новый с Core Data, я делаю свою модель данных. У меня есть 33 сущности, и между ними мало трудных отношений, но много отношений с внешними ключами.
Как я могу управлять теми отношениями, которые не являются точно 1-многими или 1-1 или многими-многими, но являются внешними ключами в базовой модели данных?
Например, у меня есть объект Contact, который связан с contact_x_mail, и в то же время contact_x_mail связан с Mail, который содержит все электронные письма. Эти отношения 1-много или много-много. Но есть и другие, такие как Institution (у контакта может быть много Institutions) и Mail, который не является отношением 1-много или 1-1, Institution имеет ForeignKey_mail_id.
Как я могу представить эти внешние ключевые отношения? Индексы?
Большое спасибо, надеюсь, мой вопрос ясен.
1 ответ
Вы думаете о CoreData с точки зрения СУБД, которой это не является. Вам не нужно устанавливать внешние ключи для создания отношений в CoreData. Если вы хотите назначить электронное письмо пользователю, вы просто создаете связь между ними, и вы можете установить атрибут "электронная почта" пользователя или атрибут "пользователь" электронной почты. ForeignKey и связывание выполняются CoreData в фоновом режиме.
С другой стороны, каждое отношение по определению: 1-1, 1-* или -. Я не уверен, что есть другой выбор...
Когда вы создаете отношения в CoreData, вы эффективно создаете новые атрибуты для этого элемента. Вот пример:
@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;
Установить их так же просто, как:
User *user = [NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:[self.fetchedResultsController managedObjectContext]];
[user setName:@"Matt"];
[user setEmailAddress:@"matt@stackru.com"];
//...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.
Надеюсь, это поможет немного прояснить ситуацию! Читайте документацию, чтобы убедиться, что CoreData подходит именно вам!
http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/CoreData.pdf