Статьи

Основные данные с нуля: модель данных

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

Эта статья посвящена модели данных приложения Core Data. Мы приближаемся к редактору моделей данных XCode и рассматриваем сущности, атрибуты и отношения.

Начните с загрузки проекта из предыдущего урока или клонируйте репозиторий из GitHub . Откройте проект в Xcode и в Project Navigator найдите Core_Data.xcdatamodeld . XCode автоматически показывает редактор модели данных, когда модель данных проекта выбрана.

Прежде чем мы исследуем пользовательский интерфейс редактора, нам нужно создать объект для работы. В нижней части редактора модели данных нажмите кнопку Добавить объект . Это добавит объект с именем Entity . Он отобразится в разделе « Объекты » слева от редактора модели данных. Измените имя объекта на Person , дважды щелкнув его в разделе сущностей .

«Что такое сущность?» Вы можете быть удивлены. Чтобы восстановить аналогию с базой данных, сущность сопоставима с таблицей в базе данных. Когда вы выбираете сущность Person , вы видите, что сущность может иметь атрибуты, отношения и извлеченные свойства. Пока не беспокойтесь о извлеченных свойствах, они — более продвинутая функция фреймворка.

Присвойте сущности Person атрибут, нажав кнопку «плюс» в нижней части таблицы « Атрибуты» . Дважды щелкните имя атрибута и установите его first В раскрывающемся меню « Тип» выберите « Строка» . Если мы сравним это с таблицей в базе данных, то Таблица Person теперь имеет first столбец типа String .

Несмотря на то, что я не хочу вводить вас в заблуждение, сравнивая сущности с таблицами базы данных, это упрощает понимание сущностей и атрибутов. Фактически, если вы используете базу данных SQLite в качестве резервного хранилища вашего приложения, Core Data создаст таблицу для хранения данных сущности Person . Однако это то, о чем нам не нужно и не нужно беспокоиться. Помните, что Core Data не является базой данных.

То же самое касается отношений. Как базовые данные отслеживают отношения, нам не о чем беспокоиться. Фактически, Core Data гарантирует, что отношения загружаются только тогда, когда они нужны приложению. Это то, что мы вернемся позже в этой серии.

Добавьте еще два атрибута к сущности Person , last тип String и age типа Integer 16 . Тип, который вы выбираете для чисел, на данном этапе не важен. Он сообщает Core Data, как он должен структурировать базу данных и оптимизировать производительность.

Атрибут объекта можно настроить с помощью инспектора модели данных . Выберите first атрибут объекта Person и откройте инспектор справа. Инспектор моделей данных позволяет настроить выбранный атрибут. На данный момент нас интересуют только несколько настроек: Необязательный , Тип атрибута и Значение по умолчанию .

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

Маркировка атрибута как обязательного имеет последствия. Если мы сохраним запись Person без действительного имени, Core Data выдаст ошибку. Это означает, что мы должны убедиться, что first атрибут записи установлен, прежде чем сохранить его.

Тип атрибута важен по нескольким причинам. Он сообщает Core Data в каком формате сохранить атрибут, а также возвращает нам данные атрибута в указанном формате. Каждый тип атрибута имеет свой набор параметров конфигурации. Измените тип атрибута first атрибута на Date, чтобы увидеть параметры конфигурации для атрибута типа Date .

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

Обратите внимание, что значение по умолчанию используется только при создании новой записи. Если существующая запись Person , например, обновлена, для first атрибута установлено значение nil , то в Core Data first атрибут не будет заполнен значением по умолчанию. Вместо этого Core data выдаст ошибку, потому что мы пометили first атрибут как необходимый.

Основные данные действительно сияют, когда вы начинаете работать с отношениями между сущностями. Давайте посмотрим, как это работает, добавив вторую сущность с именем Address . Сущность Address имеет четыре атрибута типа String , street , number , city и country .

Отношения между сущностями имеют ряд определяющих характеристик: имя, место назначения, мощность отношения, обратное отношение и правило удаления отношения.

Давайте рассмотрим взаимосвязи более подробно, создав отношения между сущностями Person и Address .

Создайте отношение, выбрав сущность Person и нажав кнопку «плюс» в нижней части таблицы « Отношения» . Назовите отношения address и установите адресата к объекту Address . Это указывает на то, что каждая запись о человеке может быть связана с записью адреса.

Как и с атрибутами, отношения по умолчанию являются необязательными. Это означает, что ошибка проверки не будет выдана, если запись о человеке не связана с записью адреса. Давайте изменим это, сняв флажок Optional в Инспекторе моделей данных справа.

На данный момент человек может иметь отношения с адресной записью. Тем не менее, если у человека есть адресная запись, связанная с ним, адресная запись не знает о записи о человеке, потому что в данный момент отношения однонаправлены — от Person к Address . Однако большинство отношений в Базовых данных являются двунаправленными, и обе сущности знают об этих отношениях.

Давайте создадим обратную связь от объекта « Address объекту « Person », выбрав объект « Address и создав отношение с именем « person с объектом « Person качестве пункта назначения.

Несмотря на то, что мы создали обратную связь между Address и Person , Xcode дает нам несколько предупреждений о том, что Person.address должен иметь обратное значение, а Address.person должно иметь обратное . Мы что-то сделали не так?

Базовые данные не достаточно умны, чтобы знать, какое отношение является обратным отношением к какому. Это легко исправить, хотя. Выберите объект « Person и установите значение « Обратное отношение address к person . Если вы сейчас выберете объект « Address , вы увидите, что обратное отношение address уже было установлено для отношения « person для вас.

Когда модель данных приобретает все большую сложность, отношения могут стать запутанными и неясными. Xcode прикрыл твою спину. Редактор модели данных имеет два стиля, таблицу и график . В правом нижнем углу редактора вы увидите переключатель, который позволяет переключаться между двумя режимами. Нажмите левую кнопку, чтобы переключиться на стиль графика.

Стиль графика показывает вам объектный граф, который мы создали до сих пор. Он показывает нам сущности, которые мы создали, их атрибуты и их отношения. Однако одной из наиболее полезных функций является визуальное представление отношений между сущностями модели данных. Линия со стрелкой на каждом конце соединяет Person и Address , обозначая их двунаправленную связь.

Отношения, которые мы создали до сих пор, относятся к одному , у человека может быть один адрес, и наоборот. Однако вполне возможно, что несколько человек живут по одному адресу. Как бы мы включили эту дополнительную информацию в нашу модель данных?

Кардинальность отношения определяет, является ли это отношением «один к многим». Давайте изменим отношение person к объекту Address чтобы сделать его отношением ко многим. Выберите отношение « person объекта « Address , измените его имя на « persons чтобы отразить отношение «ко-многим», и установите для типа отношения значение « Многие» в инспекторе справа.

Название отношений не важно, но оно показывает, что это отношение ко многим. Вы заметили, что график модели данных также обновился? Конечная точка отношения с сущностью Person имеет две стрелки для обозначения природы отношения «многие».

Подожди минуту. Разве не возможно, что человек связан с более чем одним адресом. Человек может иметь рабочий адрес и домашний адрес. Правильно? Core Data решает эту проблему, создавая взаимосвязь « многие ко многим» . Выберите address отношение объекта Person , измените его имя на addresses и установите для типа отношения значение « Многие» . Редактор модели данных показывает обновленное отношение в виде линии с двумя стрелками на каждом конце.

Базовые данные реализуют отношения очень гибко. Целевой объект отношения может даже совпадать с исходным объектом. Это известно как рефлексивные отношения. Также возможно иметь несколько связей одного типа с разными именами. Человек, например, может иметь мать и отца. Оба отношения рефлексивны, с единственным отличием — это название отношений.

Что происходит, когда запись на одном конце отношения удаляется? Если бы вы думали о Core Data как о базе данных, то ответ был бы очевиден. Базовые данные, однако, не являются базой данных.

Предположим, у вас есть сущность Account с отношением «ко-многим» к сущности User . Другими словами, учетная запись может иметь много пользователей, и каждый пользователь принадлежит одной учетной записи. Что происходит, когда вы удаляете пользователя? Что происходит при удалении учетной записи? В Core Data каждое отношение имеет правило удаления, которое проясняет, что происходит в этих ситуациях.

Правила удаления гарантируют, что вам не нужно беспокоиться об явном обновлении резервного хранилища при удалении записи. Core Data заботится об этом, чтобы гарантировать, что граф объектов остается в согласованном состоянии.

Выберите отношение addresses объекта Person и откройте инспектор справа. Меню « Удалить правило» имеет четыре параметра: « Без действия» , « Обнулить» , « Каскадировать» и « Запретить» .

Если вы выберете No Action , Core Data не будет обновлять или уведомлять исходную запись о взаимосвязи. Это означает, что исходная запись отношения по-прежнему считает, что она связана с удаленной записью. Обратите внимание, что это редко то, что вы хотите.

Этот параметр устанавливает целевое значение отношения при удалении целевой записи. Это правило удаления отношений по умолчанию.

Если отношение « Person Address установлено на « Каскад» , удаление записи о человеке также удалит все записи адреса, связанные с этой записью о человеке. Это полезно, например, если требуется отношение, и запись не может или не должна существовать без отношения. Например, пользователь не должен существовать, если он не связан с учетной записью.

В каком-то смысле Дени — это инверсия каскада . Например, если у нас есть объект Account , имеющий отношение «многие» к объекту User с правилом удаления, установленным на « Запретить» , запись учетной записи может быть удалена только в том случае, если с ней не связано никаких записей пользователя. Это гарантирует, что никакие пользовательские записи не существуют без учетной записи. Результат похож на правило удаления Cascade , но реализация отличается.

В этом руководстве мы более подробно рассмотрели модель данных, используемую приложением Core Data. Теперь вы должны быть знакомы с сущностями, атрибутами и связями, и вы сможете создавать их с помощью редактора модели данных Xcode.

Core Data очень хорошо управляет отношениями, а редактор модели данных Xcode позволяет легко создавать и управлять отношениями между объектами. Отношения между сущностями являются мощными и легко настраиваемыми. Правила удаления гарантируют, что управляемый Core Data граф объектов остается исправным и в согласованном состоянии.

В следующей статье мы запачкаем руки и начнем работать с Core Data. Вы узнаете, как создавать, читать, обновлять и удалять записи, а также знакомиться с NSManagedObject и NSFetchRequest .