Статьи

Проверка данных с помощью основных данных: общие ограничения

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

Если ваше приложение использует базовые данные для сохранения данных, то вам повезло. Фреймворк имеет ряд API для проверки объектов до их сохранения на диске. В этом уроке я покажу вам, какие опции Core Data предлагает разработчикам для проверки объектов.

Лучший способ учиться — это делать. Откройте Xcode и создайте новый проект на основе шаблона приложения Single View .

Настройка проекта

Назовите валидацию проекта и установите для языка значение Swift . Установите флажок « Использовать основные данные» внизу и нажмите « Далее» .

Настройка проекта

Откройте Validation.xcdatamodeld , создайте новый объект и назовите его User. Добавьте следующие атрибуты к сущности User:

  • первый из типа String
  • последний из типа String
  • адрес электронной почты типа String
  • возраст типа Integer 16

Создайте другую сущность, назовите ее Note и добавьте к ней следующие атрибуты:

  • название типа String
  • содержимое типа String
  • созданный в типе Дата

Пользователь может иметь много заметок, а заметка может принадлежать только одному пользователю. Это означает, что нам нужно добавить отношение « Многие» к объекту « Пользователь» с объектом « Примечание» в качестве пункта назначения. Нам также необходимо добавить отношение « Один» к объекту « Примечание» с объектом « Пользователь» в качестве пункта назначения и примечаниями в качестве обратного отношения. Вот как это выглядит в редакторе моделей данных XCode.

Настройка модели данных
Настройка модели данных

Общие ограничения могут быть определены в модели данных. Позвольте мне показать вам, как это работает. Откройте Validation.xcdatamodeld и выберите сущность Пользователь . Выберите атрибут электронной почты и откройте инспектор модели данных справа.

Правила проверки в инспекторе моделей данных

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

Это подводит нас к наиболее очевидному ограничению для атрибутов, их необязательности. Сняв флажок « Необязательно» вверху, вы сообщаете Core Data, что атрибут должен иметь значение, чтобы он был действительным.

Если объект не проходит проверку, Core Data выдает ошибку, если выполняется операция сохранения. Само собой разумеется, что Core Data не позволяет помещать недопустимые объекты в постоянное хранилище приложения.

Если вы выберете атрибут age сущности User , вы заметите, что раздел Validation выглядит немного иначе. Поскольку атрибут age имеет тип Integer 16 , вы можете установить минимальное и максимальное значение для атрибута. Вы также можете определить значение по умолчанию.

Правила проверки в инспекторе моделей данных

Выберите атрибут createAt сущности Note и откройте инспектор модели данных . Обратите внимание, что вы можете указать минимальную и максимальную дату, а также дату по умолчанию.

Правила проверки в инспекторе моделей данных

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

Отношения не очень отличаются от атрибутов. Они тоже могут быть ограничены. Отношения могут быть необязательными или обязательными. Счетчик отношения ко многим может быть ограничен минимальным и максимальным значением. Выберите атрибут notes объекта User и откройте инспектор модели данных . Счетчик отношения примечаний может иметь минимальное и максимальное значение.

Правила проверки в инспекторе моделей данных

Возможность добавлять ограничения в модель данных — это мощная концепция, и приятно знать, что она встроена в базовую среду данных.

Выберите объект « Пользователь» и пометьте каждый атрибут как требуется, сняв флажок « Необязательно» в Инспекторе моделей данных . Выберите атрибут age и установите минимальное значение 0, а максимальное значение 120 . Установите для атрибута значение по умолчанию 21 .

Добавить ограничения к атрибуту

Откройте AppDelegate.swift и обновите application(_:didFinishLaunchingWithOptions:) как показано ниже. Мы создаем экземпляр объекта User и заполняем его атрибуты. Обратите внимание, что мы установили для атрибута age значение, которое превышает максимальное значение, указанное нами в модели данных. Мы можем спросить управляемый объект, является ли он допустимым для вставки в постоянное хранилище, вызвав validateForInsert() . Поскольку этот метод выбрасывает, мы заключаем его в оператор do-catch .

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    if let entity = NSEntityDescription.entityForName(«User», inManagedObjectContext: self.managedObjectContext) {
        // Create Managed Object
        let user = NSManagedObject(entity: entity, insertIntoManagedObjectContext: self.managedObjectContext)
 
        // Populate Managed Object
        user.setValue(140, forKey: «age»)
        user.setValue(«Bart», forKey: «first»)
        user.setValue(«Jacobs», forKey: «last»)
        user.setValue(«me@icloud.com», forKey: «email»)
 
        do {
            try user.validateForInsert()
 
        } catch {
            let validationError = error as NSError
 
            print(validationError)
        }
 
    }
 
    return true
}

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

1
2
3
4
5
6
7
8
Error Domain=NSCocoaErrorDomain Code=1610 «The operation couldn’t be completed. (Cocoa error 1610.)» UserInfo={NSValidationErrorObject=<NSManagedObject: 0x7fef63611dd0> (entity: User; id: 0x7fef63613eb0 <x-coredata:///User/t8C45E95D-D8C3-4900-82FA-BC313D53D5882> ; data: {
    age = 140;
    email = «me@icloud.com»;
    first = Bart;
    last = Jacobs;
    notes = (
    );
}), NSValidationErrorValue=140, NSValidationErrorKey=age, NSLocalizedDescription=The operation couldn’t be completed.

Ошибка довольно ясна о том, что не так с управляемым объектом. Даже если локализованное описание немного расплывчато, ошибка указывает, что значение атрибута age не соответствует ограничениям, которые мы определили в модели данных.

Возможно, что во время проверки было выдано несколько ошибок проверки. Позвольте мне показать вам, как это выглядит. Чтобы избежать проблемы миграции, удалите приложение из симулятора. Пересмотрите модель данных и выберите последний атрибут сущности User . Откройте инспектор модели данных справа и снимите флажок Необязательно, чтобы сделать атрибут обязательным.

Откройте AppDelegate.swift и удалите строку, в которой мы устанавливаем фамилию записи пользователя .

1
user.setValue(«Jacobs», forKey: «last»)

Запустите приложение еще раз и проверьте вывод в консоли.

1
2
3
4
Error Domain=NSCocoaErrorDomain Code=1560 «(null)» UserInfo={NSDetailedErrors=(
    «Error Domain=NSCocoaErrorDomain Code=1610 \»The operation couldn\U2019t be completed.
    «Error Domain=NSCocoaErrorDomain Code=1570 \»The operation couldn\U2019t be completed.
)}

Словарь userInfo объекта error содержит массив ошибок, которые сообщают нам, что пошло не так во время проверки. Поймите, что те же ошибки возникают, если вы пытаетесь сохранить управляемый объект, который не прошел проверку.

Проверка данных является ключевым аспектом сохранения данных. Вы должны убедиться, что данные, которые вы вставляете в постоянное хранилище, действительны. Другими словами, данные, которые вы вставляете, должны соответствовать требованиям, которые вы определяете в модели данных и коде вашего приложения.

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