7 Core Data для Mac и iOS. Что могут делать управляемые объекты (managed objects)


NSManagedObject представляет собой запись из БД (persistent store в терминах Core Data). Создание, сохранение, редактирование, удаление проходит посредством управляемых объектов.

Управляемые объекты являются также результатом извлечения (fetch) данных. Доступ к данным осуществляется через Key-Value Coding (KVC). В KVC два акцессора: getter (valueForKey) и setter (setValueForKey). KVC это альтернативный способ получить значение переменной класса, вместо прямого доступа (плохой способ) или доступа через геттер/сеттер доступ осуществляется по ключу в runtime режиме.

Вот пример кода, который в Master-Detail Xcode template for iOS показывает значение атрибута timeStamp сущности Event в ячейке таблицы:
cell.textLabel.text = [[managedObject valueForKey:@”timeStamp”] description];


UILabel наследник UIView. У него есть много свойств например: font, textColor, textAlignment, и numberOfLines. Последнее позволяет сделать multiline text.

В MasterDetailController.m когда создается новый Event его значение устанавливается посредством key-value coding:
[newManagedObject setValue:[NSDate date] forKey:@”timeStamp”];


Есть пара случаев когда может понадобиться заменить NSManagedObject:
  • Собственная валидация. NSManagedObject имеет простую валидацию на соответствие значения типу.
  • Смена типа данных возвращаемых из persistent store. Например картинка в БД хранится как бинарные данные формата JPEG, а при извлечении конвертируется в image.
  • Реализация временных (transient) данных, которые не будут хранится в persistent store.





iPhoneCoreDataRecipes - пример реализации трансформации


Код:
@implementation ImageToDataTransformer
+ (BOOL)allowsReverseTransformation {
return YES;
}
+ (Class)transformedValueClass {
return [NSData class];
}
- (id)transformedValue:(id)value {
NSData *data = UIImagePNGRepresentation(value);
return data;
}
- (id)reverseTransformedValue:(id)value {
UIImage *uiImage = [[UIImage alloc] initWithData:value];
return [uiImage autorelease];
}

Код помещается в:
@implementation Customer
...
@implementation ImageToDataTransformer
...