Как представить отношения внешнего ключа в базовых данных - модель данных в XCode - PullRequest
5 голосов
/ 22 декабря 2011

Абсолютно новый с 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 Ответ

8 голосов
/ 28 декабря 2011

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

...