Простая связь Core Data в коде

Я новичок в какао, пытаюсь создать приложение для iPhone, включая Core Data.

Моя проблема заключается в следующем: сейчас у меня работает небольшое приложение с одним объектом под названием «Список воспроизведения», который я отображаю в виде таблицы и могу добавлять и удалять записи.

У меня есть это в моем PlayerAppDelegate:

список воспроизведенияManagedObjectModel

плейлистListManagedObjectContext

playlistListPersistentStoreCoordinator

Добавление объекта с помощью:

Playlist *playlist = (Playlist *)[NSEntityDescription
    insertNewObjectForEntityForName:@"Playlist" 
             inManagedObjectContext:playlistListManagedObjectContext];

Теперь я хочу добавить подуровень Song с отношением ко многим.

Добавлен атрибут плейлиста: songRelation Добавлен атрибут песни: playlistRelation

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

После установки этого отношения я больше не могу создавать список воспроизведения без предупреждения. Проблема в том, что "это" тоже хочет создать Песню, но я не знаю, как это сделать.

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

Мне нужно создать их:

songManagedObjectModel
songListManagedObjectContext
songListPersistentStoreCoordinator

или объект Song каким-то образом доступен через объект списка воспроизведения?

Что-то вроде этого, возможно:

Добавить плейлист

Добавить песню

Настройте атрибуты «отношения» (как?)

Сохранить в постоянном хранилище

Or????

Я действительно много гуглил и, вероятно, неправильно понял что-то основное здесь, так как нет доступных примеров....

С уважением, ПМ


person Petter Magnusson    schedule 24.07.2009    source источник


Ответы (1)


Петтер,

В объекте модели PlayList должен быть метод, который выглядит примерно так:

- (void) addSongObject:(Song *)value;

Это динамически сгенерированный метод, который вставит значение Song в отношение для песен в PlayList. Если вы не создали объект модели PlayList после добавления отношения Song, этого метода там не будет. Итак, убедитесь, что вы создаете классы моделей для любых измененных сущностей.

Объект Song, который вы передаете методу addSongObject, должен быть создан с использованием ManagedObjectContext, например:

Song *song = (Song *)[NSEntityDescription insertNewObjectForEntityForName:@"Song" inManagedObjectContext:playlistListManagedObjectContext];

Джек

person Jack Cox    schedule 24.07.2009
comment
Спасибо, Джек, попробуем! Не уверен, как сгенерировать новый код из определений сущности... но теперь я знаю, что искать. Итак, в основном я должен начать с создания плейлиста, а затем добавить песню? Я не могу пойти наоборот и создать песню, а затем создать плейлист? (Позже у меня будут гораздо более сложные отношения) Если бы у вас был полный пример последовательности, мне бы это понравилось! Что-то вроде этого, так как у меня, кажется, проблема с порядком выполнения этого: 1. Добавить плейлист: код... 2. Сохранить плейлист: код... 3. Добавить песню: код... 4. Сохранить песню: код ... 5. Соедините их: код... Rgds Petter - person Petter Magnusson; 25.07.2009
comment
Это сработало! File New... получил новые файлы .m и .h. Затем я использовал insertNewObjectForEntityForName, чтобы сделать список воспроизведения набором его атрибутов, затем снова вставил NewObjectForEntityForName, чтобы создать песню, установить атрибуты ints, затем использовал addSong, а затем сохранил контекст. Не понял, что все объекты входят в ОДНУ модель и контекст, и что я должен добавить песню в список воспроизведения, а не наоборот. Итак, теперь я могу двигаться дальше. Еще раз спасибо! PS на самом деле в Интернете вообще нет кода или руководства по этому вопросу (подсказка... ;-)! С уважением, ПМ - person Petter Magnusson; 25.07.2009
comment
Петтер, у меня нет кода, который я могу опубликовать из-за конфиденциальности клиента. Я согласен, что было бы неплохо сделать учебник по этому вопросу, но у меня нет огромного количества времени, чтобы сделать его. Что я узнал из использования CoreData, так это то, что вам нужно использовать insertNewObjectForEntityForName для создания новых пустых пустых мест и использовать процедуры выборки для извлечения существующих сущностей из диспетчера постоянства. Затем используйте addXObject для управления отношениями. - person Jack Cox; 26.07.2009
comment
Да, Джек, это как раз недостающая информация о том, что необходимо для управления отношениями в Core Data! Возможно, какой-нибудь другой читатель этого может сделать учебник или хотя бы подвести итог на хорошем примере (у меня такая же проблема со временем, как и у вас... ;-) С уважением, ПМ. - person Petter Magnusson; 26.07.2009