Валидация данных в Core Data

У валидации данных есть два аспекта:
  • указание правил;
  • имлементация правил.

Можно указать, что делать со связанной сущностью, когда другая удаляется. Это делается в Data Model инспекторе в настройках отношения сущностей. Используя этот же интерфейс можно указывать правила валидации.


Современные интерфейсы пытаются устранить саму возможность создания таких условий в которых пользователь может ошибиться. Например, на Mac OS могут отключаться некоторые пункты меню, а на iOS показываться соответствующая числовому полю клавиатура чтобы невозможно было ввести буквы.

Есть три типа правил в модели данных или схеме Core Data:
  • Referential integrity (ссылочная целостность)
  • Data validation
  • Data quality (сравнение введенных данных с другими)



Свойства сущности


  • Name. Примеры: Job, Customer
  • Class. Класс для сущности. Можно оставить по умолчанию NSManagedObject. И получать доступ к значениям посредством key-value coding (KVC).
  • Abstract Entity. Аналог абстрактного объекта в ООП.
  • Parent Entity. Родительская сущность. Может быть и абстрактной сущностью.
  • Indexes. Индексы улучшают производительность. Поиск работает быстрее, но данные обновляются медленнее. Индексы указываемые для сущности являются составными индексами состоящими из разделенных запятой свойствами сущности.


Свойства атрибутов



  • Name
  • Properties. Transient-свойства не сохраняются в хранилище данных (например, свойство name_last_first может быть transient и компоноваться из свойств last_name и first_name).
  • Optional. Чтобы сделать атрибут обязательным надо выключить эту опцию.
  • Indexed. Индексировать ли атрибут? Если да, то это будет одиночный индекс атрибута, а не составной индекс для сущности в целом.
  • Attribute Type. Тип атрибута.
  • Validation. Правила валидации зависят от типа атрибута. Для строк можно указать минимальную и максимальную длину. Для числовых типов максимальное и минимальное значение.
  • Default Value. Значение по умолчанию. Хорошо подобранные значения по умолчанию ускоряют ввод данных для пользователя.
  • Regular Expression. Для строк можно указать регулярное выражение, которое будет использоваться для валидации строки.
  • Advanced. На Mac OS X можно проиндексировать значение атрибута в Spotlight для более быстрого поиска. Также можно хранить содержимое атрибута в отдельном файла, что полезно для больших структур данных (например, видео).

Свойства отношений



  • Name. Примеры: jobs, customers
  • Destination. Другой конец отношения.
  • Inverse. Большинство отношений имеют инверсию - отношение в котором Destination является источником.
  • Properties. Transient-отношения существуют только во время выполнения. Отношение может быть опциональным. Например отношение job-to-customer должно иметь заказчика потому что без заказчика не существует задачи. Отношение customer-to-job может быть без задачи потому что заказчик мог еще зарегистрировать задачу.
  • Arranged. Можно указать, что данные упорядочены в хранилище данных.
  • Plural/Cardinality. Можно указать что это отношение один-к-одному или один-ко-многим. Иногда это свойство называется мощностью связи. Например, один заказчик может иметь много задач, но одна задача всегда имеет одного заказчика.
  • Count. Можно указать минимальное и максимальное количество сторон с каждой стороны отношения.
  • Delete Rule. Как должно вести себя отношение, когда одна из сторон удаляется?
  • Advanced. Аналогично атрибутам. Во многом отношения похожи на атрибуты.


Ввод данных в интерфейс и перемещение их в модель данных

View controller перемещает данные из Core Data managed object в текстовое поле и обратно.


self.name.text = [self.detailItem valueForKey:@”name];

Тут используется KVC для того чтобы у объекта detailItem класса NSManagedObject получить нужное значение. Обратная операция:


[self.detailItem setValue: self.name.text forKey:@”name];

Formatter-ы в Cocoa и Cocoa Touch используются для преобразования текста в другие типы и обратное. На Mac OS можно перетаскивать formatter-ы из библиотеки на текстовые поля. Также есть текстовое поле уже содержащее number formatter. Например NSDateFormatter содержит методы dateFromString и stringFromDate. Все formatter-ы являются наследниками NSFormatter и все перекрывают методы stringForObjectValue и getObjectValueForString.

Пример

1) Объявим свойство:
@property (nonatomic, retain, readonly) NSNumberFormatter *numberFormatter;

2) Имплементируем свойство:

@synthesize numberFormatter;


- (NSNumberFormatter *)numberFormatter
{
if (numberFormatter == nil){
numberFormatter = [[NSNumberFormatter alloc] init];
}
return numberFormatter;
}

3) Пример использования:


self.price.text = [numberFormatter stringFromNumber:
[NSNumber numberWithInteger:self.detailItem
valueForKey:@”price];]]];

[self.detailItem setValue: [numberFormatter numberFromString: self.price.text
forKey:@”price];


Наследование от NSManagedObject

Одна из причин наследоваться от NSManagedObject это возможность задавать собственные правила валидации.