добавление непостоянных переменных в nsmangedobject - PullRequest
10 голосов
/ 11 февраля 2012

У меня есть подкласс NSManagedObject, и я хотел бы добавить пару иваров для отслеживания некоторого учета. Я не хочу, чтобы эти переменные сохранялись, и поэтому я не включаю их в модель данных.

У меня проблемы с поиском подходящего способа сделать это.

  • Должен ли я просто создать ivars в своем классе, создать соответствующее свойство и затем синтезировать их в реализации?
  • не должен ли я создавать ivars, а вместо этого просто объявить свойство и затем @dynamic свойство в имплментации?
  • Есть ли какой-то другой подход, который я должен использовать?

И следует ли мне делать все настройки в моем подклассе NSManagedObject или я должен создавать подкласс моего подкласса, чтобы, если я изменю свою модель данных, я не потеряю все свои настройки, когда получу xcode для генерации мой подкласс NSManagedObject автоматически?

Спасибо!

Ответы [ 4 ]

10 голосов
/ 13 февраля 2012

Документация для NSManagedObject имеет раздел под названием Пользовательские переменные экземпляра .Обсуждаются оба подхода.

Оба переходных, смоделированных атрибута и ivars являются хорошими решениями.Это зависит от вкуса и стиля.

Один очень важный пункт, который следует помнить, если вы используете ивар: вам нужно очистить ивар в - (void)didTurnIntoFault и установить любые начальные значения в - (void)awakeFromFetch- (void)awakeFromInsert.Вам нужно , а не касаться любых смоделированных атрибутов или отношений внутри -didTurnIntoFault, иначе вы попадете в беду.

9 голосов
/ 11 февраля 2012

Каждый атрибут для NSManagedObject имеет флажок с именем transient . Таким образом, у вас будут динамические средства доступа к объекту без фактического сохранения самого значения свойства. Установите флажок прямо под текстовым полем для ввода имени атрибута.

enter image description here

ОБНОВЛЕНИЕ Если вы не хотите создавать миграцию из-за новых атрибутов, сделайте стандартные ivars

@interface MyMO : NSManagedObject {
    NSString *_nonPersistentAttribute;
}

@property (nonatomic, retain) NSString *nonPersistentAttribute;

@end

@implementation MyMO

@synthesize nonPersistentAttribute=_nonPersistentAttribute;

@end
2 голосов
/ 12 февраля 2012

Wise,

К вашему первому вопросу о: ivars, у вас есть два варианта стандартных ivars или переходных атрибутов вашей сущности. Большая разница между ними состоит в том, что переходные атрибуты участвуют в аспектах изменения / грязного / отмены Базовых данных. Если вашим иварам это не нужно, не используйте переходные атрибуты. (Да, используйте @property и @synthesize для своих иваров.)

На ваш второй вопрос: где вносить изменения? Я немного луддит. Шаблоны заголовков, автоматически генерируемые Xcode, довольно просты. Следовательно, я использую автоматически сгенерированные файлы в первый раз, когда я создаю сущность и впоследствии редактирую свои изменения. Честно говоря, вы не очень часто меняете структуру данных модели. Следовательно, добавление нескольких строк здесь и там в оба файла .h & .m не требует больших затрат. Есть и другие механизмы. Система генератора Wolf Rentzch уважаема и полезна. Тем не менее, я не уверен, что mogenerator решает проблему, с которой сталкиваются современные программисты Objective-C v2 Core Data. (Obj-C v2 значительно упростила программистов Core Data.)

Andrew

1 голос
/ 11 февраля 2012

Вот удобный шаблон, который я использовал в прошлом:

Создайте категорию своего класса и поместите ее в дополнительный исходный файл, такой как ManagedObject+Support.h.Помните, что в объявлении интерфейса вы просто используете квадратные скобки, как это:

@interface ManagedObject (Support)
// declare your variables and methods
@end

Таким образом, вы можете изменить положение вещей без необходимости изменения модели управляемого объекта.(Смена MOM имеет много проблем с заполненными базами данных, миграцией и т. Д.).При изменении модели вы можете снова сгенерировать файлы классов, не теряя код в категории.

...