Добавление непостоянных переменных в nsmangedobject

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

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

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

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

Спасибо!

Ответ 1

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

enter image description here

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

@interface MyMO : NSManagedObject {
    NSString *_nonPersistentAttribute;
}

@property (nonatomic, retain) NSString *nonPersistentAttribute;

@end

@implementation MyMO

@synthesize nonPersistentAttribute=_nonPersistentAttribute;

@end

Ответ 2

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

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

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

Ответ 3

Мудрый,

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

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

Эндрю

Ответ 4

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

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

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

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