Понимание NSManagedObject - PullRequest
       13

Понимание NSManagedObject

2 голосов
/ 31 июля 2010

В существующем проекте я пытался ввести Базовые Данные еще долго после того, как проект был создан, поэтому его модель уже существует. Я создал xcdatamodel и добавил в него свой единственный класс. Этот класс должен действовать как глобальное хранилище для объектов в моем приложении. Класс правильно реализует NSManagedObject, и я проверил, что он создается и сохраняется в контексте, а также извлекается с результатом выборки.

Способ сохранения данных в этом классе - с помощью NSMutableArray. Но это просто не работает. Вот фрагмент этого класса:

@interface WZMPersistentStore : NSManagedObject<NSCoding> {
 NSMutableArray *persistentStorage;
}

@property(nonatomic,retain) NSMutableArray *persistentStorage;

-(void)add:(id)element;
-(void)remove:(id)element;
-(id)objectAtIndex:(NSUInteger)index;
-(NSUInteger)num;

@end

В реализации я также переопределяю initWithEntity следующим образом:

- (id)initWithEntity:(NSEntityDescription*)entity insertIntoManagedObjectContext:(NSManagedObjectContext*)context {
 NSLog(@"init with entity");
 [super initWithEntity:entity insertIntoManagedObjectContext:context];

 return [self init];
}

Метод init только инициализирует изменяемый массив, и из журнала видно, что он правильно вызывается делегатом приложения при создании сущности. Метод add просто отправляет сообщение insertObject в persistentStorage. Вопросы, которые приходят из этого:

  1. Я делаю "концептуально", верно? я значит, правильно ли иметь экземпляр переменная в управляемом объекте и инициализировать как я?
  2. при регистрации размера файла persistentStorage Я всегда получаю 0 даже когда регистрируете момент после сообщение addObject (редактировать: это не правда, я проверил еще раз, и я правильно получил 1 добавлено) .
  3. Объект хранится в управляемом объекте класс корыта persistentStorage являются нормальный класс с атрибутом. Является есть что-то, что мне нужно сделать с их? Я полагаю, не потому, что я не появляется никаких ошибок во время выполнения.

Ответы [ 2 ]

2 голосов
/ 06 августа 2010

Нет , это не «правильный» подход.Вы можете выполнить инициализацию переменных экземпляра в awakeFromFetch.Правила Apple для подклассов NSManagedObject включают следующее:

Вам также не рекомендуется переопределять initWithEntity:insertIntoManagedObjectContext:, dealloc или finalize.Изменение значений в методе initWithEntity:insertIntoManagedObjectContext: не будет замечено контекстом, и если вы не будете осторожны, эти изменения могут быть не сохранены.Большая часть настройки инициализации должна выполняться одним из активных методов ...Если вы переопределяете initWithEntity:insertIntoManagedObjectContext:, вы должны убедиться, что придерживаетесь требований, изложенных в описании метода [...] ( NSManagedObject Class Reference )

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

0 голосов
/ 01 августа 2010

Мне наконец-то удалось решить эту проблему.Даже если я новичок в объективе-c, я думаю, что ввод основных данных после завершения проекта - не очень хорошая идея.Даже если многие утверждают, что это легко.К сожалению, все люди, которые так говорят, показывают в качестве доказательства какое-то действительно простое руководство по одному объекту с одним строковым атрибутом, который нужно изменить.Вместо этого для моего проекта я написал много кода в дополнение к существующему, а также некоторые подклассы (например, NSManagedObject), которые нарушают исходную модель.Этот добавленный код также должен быть написан тщательно.Производная проблема может быть такой же простой, как не сохраненный атрибут, или опасной, как удаление неправильных сущностей.

Фактически, моя проблема была из-за неправильной конфигурации в методе декодирования и кодирования в классах, участвующих в процессе сериализации.

По моим вопросам:

-Пункт один по-прежнему остается без ответа, потому что я еще не уверен в цели-c

-Пункт два, как я уже говорил, связанный объект имелкакая-то проблема с кодированием / кодом.

- Скажи три, я ошибся, нужно написать много кода, в зависимости от того, насколько сложным является соответствующий класс.

...