CoreData - как создать подкласс подкласса NSManagedObject (шаблон Generation Gap) - PullRequest
7 голосов
/ 02 июня 2009

Я уверен, что это, должно быть, глупый вопрос, но я покопался в паутинах и не могу найти ответ. Многие люди говорят об использовании шаблона Generation Gap, в котором у вас есть подкласс NSManagedObject, сгенерированный из вашей модели, а затем подкласс, который добавляет временные свойства и поведения. Преимущество этого заключается в том, что если вы измените свою постоянную модель, вы можете просто снова сгенерировать свои базовые файлы без какой-либо опасности перезаписи собственного кода.

У меня есть базовый объект CardMO, полученный из NSManagedObject. Затем я делаю это на подкласс, чтобы создать собственный объект Card.

У меня вопрос, как мне создать управляемый объект Card?

Я пытался:

  Card* card = [NSEntityDescription insertNewObjectForEntityForName:@"CardMO" inManagedObjectContext:moc];

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

Я пытался создать карту с помощью alloc / init (где init просто вызывает [super init]), а затем добавить ее в managedObjectContext следующим образом:

[moc insertObject:(CardMO*)card];

Это дает мне загадочную ошибку "Не удалось вызвать назначенный инициализатор для класса NSManagedObject 'Card'"

Я попытался изменить это, вызвав [NSEntityDescription insertNewObjectForEntityForName: @ "CardMO" inManagedObjectContext: [AIStoreManager sharedAIStoreManager] .managedObjectContext] вместо [super init]. В этом случае объект, который я возвращаю, снова является CardMO, и я не могу вызвать методы Card для него.

Что мне делать?

И (для бонусных баллов :-) - после того, как я преодолел это препятствие, мне нужно создать мои другие объекты Card из XML, а затем превратить их в NSManagedObjects. Я использую код, основанный на Apple XMLReaderSAX - я передаю этот код в виде фрагмента XML, и он возвращает мне массив многих объектов Card. Могу ли я позже добавить эти объекты в контекст моего управляемого объекта или мне нужно войти в XMLReaderSAX и изменить способ создания этих объектов?

Я пишу приложение для iPhone на 3.0, но предполагаю, что это то же самое для Core Data для 10.5.

Ответы [ 2 ]

8 голосов
/ 02 июня 2009

Sussed it!

В модели данных имя класса для сущности должно быть именем самого производного класса - Card в моем случае. Проблема в том, что вы должны помнить, чтобы изменить имя на CardMO, прежде чем создавать новые файлы.

Наверное, поэтому люди используют mogenerator .

0 голосов
/ 20 ноября 2010

Почему бы не использовать NSCoding? Тогда вы могли бы поддерживать XML или JSON или любые другие средства описания объекта вне вашего приложения.

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