Объявление свойства для отношений ко-многим в Базовых данных - PullRequest
9 голосов
/ 12 мая 2009

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

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

@interface VBPlaylist : NSManagedObject {
}

@property (readwrite, copy) NSString *name;

@end

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

@implementation VBPlaylist

@dynamic name;

@end

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

Ответы [ 3 ]

18 голосов
/ 12 мая 2009

Отношения к одному моделируются базовыми данными как ссылки на объекты. Таким образом, отношение «один к одному» от сущности 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", чтобы получить KVO-совместимый прокси для отношения manyBazz.

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

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

16 голосов
/ 12 мая 2009

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

  1. Выберите объект в моделировщике данных.
  2. Нажмите Command-N или выберите Файл-> Новый файл…
  3. Выберите «Какао» из списка источников.
  4. В шаблоне выбора вы должны увидеть элемент под названием «Класс управляемых объектов». Если этого нет, нажмите Отмена и повторите шаги 1-2.
  5. Нажмите Далее, выберите проект / цель и снова нажмите Далее.
  6. Теперь вы видите что-то вроде следующего окна: Окно New Managed Object Class 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 маркеров, которые говорят компилятору не беспокоиться об отсутствующих методах / переменных, соответствующих свойствам.

2 голосов
/ 14 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...