2011-12-22 4 views
5

Полностью новый с данными Core Data, я делаю модель данных. У меня есть 33 объекта, и между ними существует довольно много серьезных отношений, но очень много отношений с внешним ключом.Как представлять отношения внешнего ключа в базовых данных - модель данных в XCode

Как я могу управлять такими отношениями, которые не являются точно 1-многими или 1-1 или многими-многими, но являются внешними ключами в Core Data Model?

Например, у меня есть контактное лицо, которое имеет отношения с contact_x_mail, и в то же время contact_x_mail имеет отношения с Mail, содержащими все электронные письма. Эти отношения 1-многие или многие-многие. Но есть и другие, такие как Institution (контакт может иметь много институтов) и Mail, а не отношения 1-много или 1-1, у Institution есть ForeignKey_mail_id.

Как я могу представить, какие отношения с внешним ключом? Индексы?

спасибо, надеюсь, мой вопрос ясен.

+0

Я не уверен, что действительно понимаю. Если отношение не 1-M, M-M или 1-1, то что же тогда? – paulbailey

ответ

8

Вы думаете о 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:@"[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. 

Надеется, что это помогает очистить вещи немного! Прочитайте документацию, чтобы убедиться, что CoreData подходит именно вам!

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