Как сохранить сущность в Базовых данных и применить отношения? - PullRequest
1 голос
/ 28 декабря 2011

Я пытался найти документацию / руководства Apple по тому, как позволить пользователю динамически добавлять объект и применять необходимые отношения, но мне нужна некоторая помощь с тем, какие учебники хороши или какая документация Apple поможет.

Пример моей проблемы с основными данными: 2 сущности Photographer и Photo, где существует отношение 1-ко-многим между Photographer и Photo. Когда пользователь добавляет Photo, мне нужно иметь возможность указать, какой Photographer взял это Photo.

1 Ответ

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

Итак, сначала вы создадите новый объект для фотографии:

    NSManagedObject *photoObject = [NSEntityDescription 
           insertNewObjectForEntityForName:[entity name]
                    inManagedObjectContext:context];    

NSManagedObject может быть заменен вашим объектом Photo или w / e, если у вас есть созданный подкласс. Вы установите все атрибуты для него. Чтобы установить фотографа, вы установите его так же, как любой другой атрибут. Если у вас нет ссылки на Фотографа, вы можете запросить ее следующим образом:

    NSFetchRequest *query = [[NSFetchRequest alloc] initWithEntityName:@"Photographer"];
    [query setPredicate:[NSPredicate predicateWithFormat:@"id == %@", photographerId]];
    NSArray *queryResults = [context executeFetchRequest:bcQuery error:&error];

Ваш результат запроса будет иметь объект фотографа. Затем вы можете установить его в своем фотообъекте как любой другой атрибут, и ссылка будет создана автоматически.

     [photoObject setPhotographer:[queryResults objectAtIndex:0]];

или, если вы используете NSManagedObject:

    [photoObject setValue:[queryResults objectAtIndex:0] forKey:@"photographer"];

Крутая вещь с CoreData в том, что он реляционный Вы не можете думать об этом как о типичной СУБД. Вы создаете объект и устанавливаете отношения между ними очень объектно-ориентированным способом. Не нужно заботиться о первичном / внешнем ключе, все это делается в фоновом режиме CoreData.

EDIT:

Вы можете выбрать создание подкласса NSManagedObject для более легкого доступа к атрибутам и отношениям для вашей сущности. Обязательно укажите этот подкласс в проводнике модели CoreData; на боковой панели вы измените поле «класс» на ваш новый подкласс.

Вот пример подкласса NSManagedObject:

//Interface
@interface Photo : NSManagedObject

#pragma mark - Attributes

@property (nonatomic, strong) NSNumber *id;
@property (nonatomic, strong) NSString *name;

#pragma mark - Relationships

@property (nonatomic, strong) NSSet     *someToManyRelationship;
@property (nonatomic, strong) Photographer *photographer;

@end

//Implementation
@implementation Photo

@dynamic id, name;
@dynamic someToManyRelationship, photographer;

@end

Надеюсь, это поможет!

...