Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Mobile Development
Code

Core Data с нуля: стек Core Data

by
Difficulty:IntermediateLength:LongLanguages:
This post is part of a series called Core Data from Scratch.
Core Data from Scratch: Data Model

Russian (Pусский) translation by Alex Grigorovich (you can also view the original English article)

Введение

Фреймворк Core Data существует уже много лет. Он используется в тысячах приложений и миллионами людей, как на iOS, так и на OS X. Core Data поддерживаются Apple и очень хорошо документированы. Это состоявшийся фреймворк, который доказывает свою ценность снова и снова.

Core Data использует преимущества языка Objective-C и его среды и плавно интегрируется с базой Core Foundation. Результат - простая в использовании инфраструктура для управления графом объектов, элегантный в использовании и невероятно эффективный с точки зрения использования памяти.

1. Требования

Несмотря на то, что Core Data не сложная сама по себе, если вы новичок в разработке на iOS или OS X, я рекомендую вам сначала ознакомиться с нашей серией уроков о разработке на iOS. Она научит вас основам разработки на iOS, и после завершения серии у вас будет достаточно знаний для изучения более сложных тем, таких как Core Data.

Как я уже сказал, Core Data не такая сложная для понимания, как думают многие разработчики. Тем не менее, я уверен, что хорошая база имеет решающее значение для ускорения работы с Core Data. У вас должно быть понимание API Core Data, чтобы избежать неправильного применения и убедиться, что вы не столкнётесь с проблемами при использовании фреймворка.

Каждый компонент Core Data имеет определенную цель и функцию. Если вы попытаетесь использовать Core Data таким образом, каким он не был задуман, вы неизбежно столкнетесь с трудностями использования фреймворка.

То, что я расскажу в этой серии о Core Data, применимо к iOS 6+ и OS X 10.8+, но основное внимание будет уделено iOS. В этой серии я буду работать с Xcode 5 и iOS 7 SDK.

2. Изучаем Кривые

Структура Core Data может показаться сложной на первый взгляд, но API становится интуитивно понятным и лаконичный, как только вы поймете, как различные части взаимодействуют друг с другом. И это именно та часть, где большинство разработчиков сталкиваются с проблемами. Они пытаются использовать Core Data, прежде чем они увидят весь пазл, и не знают, как части головоломки соотносятся друг с другом.

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

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

3. Что такое Core Data?

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

Что такое Core Data, если это не база данных? это модельный уровень вашего приложения в самом широком смысле. Это модель в шаблоне Model-View-Controller который пронизывает IOS SDK.

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

4. Стек Core Data

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

NSManagedObjectModel

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

Объект NSManagedObjectModel знает о модели данных, загружая один или несколько файлов модели данных во время ее инициализации. Мы рассмотрим, как это работает через несколько мгновений.

NSPersistentStoreCoordinator

Как и указывает его имя, объект NSPersistentStoreCoordinator сохраняет данные на диске и гарантирует совместимость хранилищ и моделей данных. Он является посредником между постоянным хранилищем (хранилищами) и контекстом (-ами) управляемого объекта, а также занимается загрузкой и кэшированием данных. Так и есть. В Core Data встроено кэширование.

Постоянный координатор хранилища является проводником оркестра Core Data. Несмотря на свою важную роль в стеке Core Data, мы редко взаимодействуем с ним напрямую.

NSManagedObjectContext

Объект NSManagedObjectContext управляет набором объектов модели, экземплярами класса NSManagedObject. Возможно иметь несколько контекстов управляемых объектов. Каждый контекст управляемого объекта поддерживается постоянным координатором хранилища.

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

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

5. Изучение стека Core Data

Шаг 1: Шаблон Xcode

Давайте рассмотрим стек Core Data более подробно, взглянув на шаблон Xcode Apple для Core Data. Создайте новый проект в Xcode 5, выбрав New > Project... в меню File. Выберите шаблон Пустое приложение из списка шаблонов приложений iOS слева.

Назовите проект Core Data, установите Devices на значение iPhone и установите флажок Использовать основные данные. Укажите Xcode, где вы хотите сохранить файлы проекта и нажмите Создать.

Шаг 2: Обзор

По умолчанию Apple помещает код, связанный с Core Data в класс делегирования приложения, класс TSPAppDelegate в нашем примере. Начнем с изучения интерфейса TSPAppDelegate.

Как вы можете видеть, делегат приложения имеет свойство для каждого компонента стека основных данных, а также два удобных метода: saveContext и applicationDocumentsDirectory.

Обратите внимание, что свойства Core Data отмечены как readonly, что означает, что экземпляры не могут быть изменены объектами, отличными от самого приложения.

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

Поскольку свойства в интерфейсе класса TSPAppDelegate объявляются как readonly, не создаются методы setter. Первая директива @synthesize сообщает компилятору связать переменную экземпляра _managedObjectContext с свойством managedObjectContext, которое мы объявили в интерфейсе класса. Это общий шаблон для поэтапной загрузки объектов.

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

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

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

На практике это означает, что реализация класса TSPAppDelegate похожа на то, что вы ожидаете в классе делегирования приложения, за исключением методов saveContext и applicationDocumentsDirectory, а также методов getter для управляемого ObjectContext, managedObjectModel и persistentStoreCoordinator. Именно в этих методах происходит волшебство. Это одна из жемчужин Core Data, настройка очень проста и взаимодействие с Core Data так же проста.

Шаг 3: Контекст управляемого объекта

Класс, который вы будете использовать чаще всего, помимо NSManagedObject, при взаимодействии с основными данными - это NSManagedObjectContext. Начнем с изучения его геттера.

Первые три строки его реализации типичны для геттера, который поэтапно загружает переменную экземпляра. Если объект NSManagedObjectContext не равен null, он возвращает объект. Интересный момент - это фактическое создание объекта NSManagedObjectContext.

Сначала мы получаем ссылку на координатор хранилища сохранения, вызывая его метод getter. Постоянный координатор хранилища также загружается поэтапно, как мы увидим в следующий момент. Если постоянный координатор хранилища не равен null, мы создаем экземпляр NSManagedObjectContext и устанавливаемего свойство persistentStoreCoordinator и передаем его постоянному координатору хранилища. Это было не слишком сложно. Не так ли?

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

Шаг 4: Постоянный координатор хранилища

Как мы уже видели, метод persistentStoreCoordinator вызывается методом managedObjectContext. Взгляните на реализацию persistentStoreCoordinator, но не позволяйте этому напугать вас. На самом деле это не так сложно.

Вы наверняка захотите сохранить граф объектов Core Data на диске, а шаблон Xcode Apple использует базу данных SQLite для достижения этой цели.

Когда мы создаем постоянный координатор хранилища в persistentStoreCoordinator, мы указываем местоположение хранилища на диске. Начнем с создания объекта NSURL, который указывает на это место в изолированной программной среде приложения. Мы вызываем applicationDocumentsDirectory, вспомогательный метод, который возвращает местоположение, объект NSURL, в каталоге Documents в изолированной программной среде приложения. Мы добавляем Core_Data.sqlite к местоположению и сохраняем его в storeURL для последующего использования.

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

Как я уже говорил, расширение .sqlite подсказывает, что хранилище на диске представляет собой базу данных SQLite. Несмотря на то, что Core Data поддерживает несколько типов хранилищ, SQLite на сегодняшний день является наиболее используемым типом хранилища из-за его скорости и надежности.

На следующем шаге мы создаем экземпляр постоянного координатора хранилища, вызывая initWithManagedObjectModel: и передаем экземпляр NSManagedObjectModel. Мы получаем ссылку на модель управляемых объектов, вызывая метод managedObjectModel, который мы рассмотрим далее.

Теперь у нас есть экземпляр класса NSPersistentStoreCoordinator, но пока нет связанного с ним хранилища. Мы добавляем хранилище к  постоянному координатору, вызывая довольно впечатляющий метод: addPersistentStoreWithType: configuration:URL:options:error:.

Первый аргумент указывает тип хранилища NSSQLiteStoreType в этом примере. Core Data также поддерживает двоичные хранилища (NSBinaryStoreType) и хранилище в памяти (NSInMemoryStoreType).

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

Четвертый аргумент - это NSDictionary - опции, которые позволяют нам изменять поведение постоянного хранилища. Мы рассмотрим этот аспект позже в этой серии и перейдем сейчас к null. Последний аргумент - ссылка на указатель NSError.

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

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

На данный момент abort вызывается, когда addPersistentStoreWithType:configuration:URL:options:error: возвращает null. Как поясняют комментарии в инструкции if, вы никогда не должны вызывать abort  в рабочей среде, потому что это приводит к сбою приложения. Мы исправим это позже в нашей серии.

Шаг 5: Управляемая модель объекта

Третий и последний фрагмент головоломки - это модель управляемых объектов. Давайте посмотрим на getter свойства managedObjectModel.

Реализация его очень проста. Мы сохраняем местоположение модели приложения в modelURL и передаем modelURL в initWithContentsOfURL: для создания экземпляра класса NSManagedObjectModel.

На данный момент вы, вероятно, задаетесь вопросом, на что указывает модель ModelURL, и что такое файл с расширением .momd. Чтобы ответить на эти вопросы, нам нужно выяснить, что еще создал Xcode для нас во время настройки проекта.

В Навигаторе проектов слева вы должны увидеть файл с именем Core_Data.xcdatamodeld. Это модель данных приложения, скомпилированный в файл .momd. Это файл .momd, который использует модель управляемых объектов для создания модели данных приложения.

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

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

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

6. Соединяем все вместе

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

Вышеприведенная диаграмма - это визуальное представление того, что мы изучили в шаблоне Xcode мгновение назад. Объект NSPersistentStoreCoordinator является мозгом стека основных данных приложения. Он ведет переговоры с одним или несколькими постоянными хранилищами и гарантирует сохранение, загрузку и кэширование данных.

Постоянный координатор хранилища знает о модели данных, схеме графического объекта, если хотите, через объект NSManagedObjectModel. Модель управляемых объектов создает модель данных приложения из одного или нескольких файлов .momd, двоичных представлений модели данных.

И последнее, но не менее важное: приложение обращается к графу объектов через один или несколько экземпляров класса NSManagedObjectContext. Контекст управляемого объекта знает о модели данных через постоянный координатор хранилища, но он не знает или не поддерживает ссылку на модель управляемых объектов. Нет необходимости в этом соединении.

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

Заключение

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

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

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.