2009-05-11 2 views
9

У меня есть приложение, написанное с использованием Core Data. У меня есть два объекта с отношением «один ко многим». Я подклассифицировал NSManagedObject для обоих из них. Объект с одной стороны называется Playlist, а другой называется Song.Объявление свойств для многих отношений в данных ядра

Интерфейс для списка воспроизведения:

@interface VBPlaylist : NSManagedObject { 
} 

@property (readwrite, copy) NSString *name; 

@end 

Реализация для списка воспроизведения:

@implementation VBPlaylist 

@dynamic name; 

@end 

Я думаю, что я должен иметь еще одно свойство, чтобы указать песни под класса Playlist. Я не могу найти код примера, который показывает отношения «многие», написанные как свойства. Как ты делаешь это?

+0

Кроме того, посмотрите [это сообщение в блоге] (http://nvie.com/archives/263 «Автоматическое создание классов для вашей модели данных основных данных») для чрезвычайно простого ** автоматического ** создания классов , – nvie

ответ

18

Взаимоотношения между собой моделируются как ссылки на объекты по данным ядра. Таким образом, отношение к одному из Entity Bar для лица Baz (при условии, Baz реализуется классом Baz) будет

@interface Bar : NSManagedObject { 
} 

@property (readwrite,nonatomic) Baz * toBaz; 

@end 

ко-многим моделируются как изменяемый установить свойство (хотя не как NSMutableSet). Предполагая, что отношение ко многим из Bar в Baz под названием manyBazz:

@interface Bar : NSManagedObject { 

} 

@property (retain) NSSet* manyBazz; 

@end 

// coalesce these into one @interface AnalysisRecord (CoreDataGeneratedAccessors) section 
@interface Bar (CoreDataGeneratedAccessors) 
- (void)addManyBazzObject:(Baz *)value; 
- (void)removeManyBazzObject:(Baz *)value; 
- (void)addManyBazz:(NSSet *)value; 
- (void)removeManyBazz:(NSSet *)value; 

@end 

Если вы хотите использовать интерфейс NSMutableSet манипулировать manyBazz отношений, вы должны вызвать -mutableSetValueForKey:@"manyBazz", чтобы получить КВО-совместимый прокси-сервер для manyBazz отношений.

На Leopard (OS X 10.5), а затем все соответствующие методы автоматически генерируются во время выполнения базой данных Core, даже если вы явно не объявляете или не реализуете их (вы, конечно же, получите компилятор если вы пытаетесь использовать их, не объявляя их в файле заголовка). Таким образом, вы не необходимости подкласс

Самый простой способ получить декларации и реализации права является выбор атрибутов в моделер данных и выберите «Копировать Objective-C Метод 2,0 Declarations в буфер» из «Дизайн- > Data Model ", вставьте в свой исполняемый файл .h-файла. Разумеется, вам нужно сохранить свою синхронизацию .h и модели ... следовательно, сердечная рекомендация для рендекса rentzsch MO Generator - инструмента, который автоматически генерирует (и воссоздает) подклассы NSManagedObject из вашей модели данных.

+0

Итак, в этом случае, если я хочу добавить объект Baz в Bar, я могу сделать: [barInstance addManyBazzObject: bazInstance] или bazInstance.bar = barInstance? – hekevintran

+0

Да, это правильно. –

+0

Я думаю, вы забыли закончить последнее предложение. –

16

Самый простой способ создания .h и .m файлов для ваших сущностей CoreData это:

  1. Выберите объект в моделер данных.
  2. Нажмите Command-N или выберите File-> New File ...
  3. Выберите 'Cocoa' из списка источников.
  4. В шаблоне выбора вы должны увидеть элемент под названием «Управляемый класс объектов». Если этого нет, нажмите «Отмена» и повторите шаги 1-2.
  5. Нажмите Далее, выберите проект/цель и нажмите «Далее» еще раз.
  6. Теперь вы видите следующее окно: New Managed Object Class window http://blog.alanquatermain.net/images/ManagedObjectClass.png
  7. Выберите нужные параметры и нажмите кнопку «Готово».

Это будет генерировать следующий заголовок и исходные файлы:

Entity.h:

#import <CoreData/CoreData.h> 


@interface Entity : NSManagedObject 
{ 
} 

@property (retain) NSNumber * uniqueID; 
@property (retain) NSString * name; 
@property (retain) Entity * parent; 
@property (retain) NSSet* children; 

@end 

@interface Entity (CoreDataGeneratedAccessors) 
- (void)addChildrenObject:(Entity *)value; 
- (void)removeChildrenObject:(Entity *)value; 
- (void)addChildren:(NSSet *)value; 
- (void)removeChildren:(NSSet *)value; 

@end 

Entity.m:

#import "Entity.h" 


@implementation Entity 

@dynamic uniqueID; 
@dynamic name; 
@dynamic parent; 
@dynamic children; 

@end 

Обратите внимание, что реализация не содержит ничего, кроме @dynamic, чтобы сообщить компилятору, чтобы он не беспокоился о недостающих методах/переменных в соответствии со свойствами.

+0

Прохладный. Сгенерированный код дает хорошие примеры того, как это установить. Сегодня я много использую. –

2

Это немного изменилось. Начиная с 4.2.1 (март 2012 г.), вы переходите в New File; выберите «Основные данные» (а не «Какао»), а затем выберите «Новый подкласс NSObjectModel». Отсюда он создает подкласс, как описано выше.

+0

Кроме того, 'CMD + N' вместо file-> new –