Use core data xcode что это
Core Data для iOS. Глава №1. Теоретическая часть
Хабралюди, добрый день!
Сегодня хочу начать написание ряда лекций с практическими заданиями по книги Михаеля Привата и Роберта Варнера «Pro Core Data for iOS», которую можете купить по этой ссылке. Каждая глава будет содержать теоретическую и практическую часть.
Приступаем
Что такое Core Data?
Используя компьютеры для выполнения своих задач, люди рассчитывают, что внесенные ими изменения будет сохранены. Сохранение изменений играет важную роль в офисных программных пакетах, текстовых редакторах, играх, браузерах и тд. Большинство программного обеспечения нуждается в возможности хранить введенные пользователем данные для последующего восстановления состояния работы, но конечно же есть и такое ПО, которое в этом не нуждается — калькуляторы, новостные ленты, будильники, виджеты о погоде.
Понимание того, каким образом можно хранить данные на iDevice, является критически важным при разработке продвинутых приложений.
Apple предоставляет гибкий фрэймворк для работы с хранимыми на устройстве данными — Core Data. Конечно же Core Data не панацея и есть другие варианты хранения данных, которые могут лучше подойти при решении определенных задач, но уж очень хорошо и красиво Core Data вписывается в Cocoa Touch. Большинство деталей по работе с хранилищем данных Core Data скрывает, позволяя вам сконцентрироваться на том, что действительно делает ваше приложение веселым, уникальным и удобным в использовании.
Не смотря на то, что Core Data может хранить данные в реляционной базе данных вроде SQLite, Core Data не является СУБД. По-правде Core Data в качестве хранилища может вообще не использовать реляционные базы данных. Core Data не является чем-то вроде Hibernate, хотя и предоставляет некоторые возможности ORM. Core Data скорее является оболочкой/фрэймворком для работы с данными, которая позволяет работать с сущностями и их связями (отношениями к другим объектами), атрибутами, в том виде, который напоминает работы с объектным графом в обычном объектно-ориентированном программировании.
Core Data был внедрён лишь начиная с Mac OS X 10.4 Tiger и iPhone SDK 3.0
История хранения данных в iOS
Как за выпущенные Pixar мультфильмы мы должны благодарить компанию NeXT, так и за Core Data мы должны сказать ей спасибо. Core Data родилась и эволюционировала из технологии, называемой Enterprise Objects Framework (EOF).
Дебют фрэймворка приходится на 2005 год с запуском Mac OS X 10.4 (Tiger), а вот в IPhone появляется лишь начиная с версии 3.0.
До того, как Core Data пришла на IPhone, разработчикам приходилось не сладко и для хранения данных могли быть использованы следующие варианты:
1) Списки свойств, которые содержали пары ключ-значение из различных типов данных.
2) Сериализация данных и хранение их в файлах (использовался протокол NSCoding)
3) Реляционная база данных SQLite
4) Хранение данных в облаке
Эти методы всё еще продолжают использоваться, хотя и ни один метод из четырёх не сравнится по удобству с использованием Core Data. Несмотря на рождение таких фрэймворком, как FMDatabase и ActiveRecord, для решения проблемы с хранением данных до появления Core Data, разработчики с удовольствием переключились на Core Data после его появления.
Хотя повторюсь, что Core Data не является лекарством от всех болезней, иногда вы конечно будете обращаться к решениям с использованием, например, списка свойств, но чаще всего вы будете сталкиваться с необходимостью и желанием использовать в своих приложениях именно Core Data, как инструмент, который наилучшим образом позволяет решить вашу проблему.
Чем чаще и чем больше вы будете программировать и использовать Core Data, тем чаще у вас будет возникать не вопрос «Стоит ли мне использовать Core Data?», а «Есть ли причина не использовать Core Data?».
Создание простого приложения с Core Data
В этой секции мы создадим простое приложение основанное на Core Data из одного из шаблонов XCode, основные части которого разберём. В конце этой части вы поймете, каким образом приложение взаимодействует с Core Data для хранения и получения данных.
Понимание основных компонентов Core Data
Перед тем, как погрузиться в код и разбор тестового приложения, необходимо иметь представление о компонентах Core Data. На рисунке ниже продемонстрированы основные элементы, которые мы будем использовать в тестовом приложении.
Как пользователь Core Data вы никогда не должны работать напрямую с хранилищем данных. Абстрагируйтесь от хранилища, от типа хранилища, думайте только о данных! Особенностью такого подхода является возможность безболезненно сменить тип хранилища (был XML файл, а стал SQLite) не меняя большое кол-ва написанного вами кода.
Объекты, которые находятся под управлением фрэймворка (Core Data) должны наследовать методы/свойства класса NSManagedObject.
Так же, как и людям, объектам нужна среда в которой они могут существовать, такая среда есть и, называется она managed object context (среда управляемых объектов) или просто context. Среда, в которой находится объект, следит не только за тем, в каком состоянии находится объект с которым вы работаете, но и за состояниями связанных объектов (объектов, которые зависимы от данного и от которых зависим он сам).
Экземпляр класса NSManagedObjectContext предоставляет ту самую среду для объектов, объект данного типа должен быть доступен в вашем приложении всегда. Обычно экземпляр класса NSManagedObjectContext является свойством делегата вашего приложения. Без среды, без экземпляра класса NSManagedObjectContext вам просто не удастся работать с Core Data.
Создание нового проекта
Запустим XCode и создадим новый проект из шаблона Master-Detail Application:
Заполним поля следующим образом:
И после завершения создания увидим примерно такую картину:
Запускаем наш проект
Перед тем как начать разбираться, что находится под капотом данного приложения, давайте запустим и разберемся, что вообще делает приложение.
Жмём на кнопку «Run» и перед нами появится вот такое:
Нажмем несколько раз на кнопку с «+» и в списке появится несколько записей со временем.
Теперь завершим (остановим) работу приложения и, если приложение не использовало бы Core Data для хранения данных, то при очередном запуске мы увидели бы пустой список снова, однако после перезапуска мы видим всё ту же картину:
Разбираем составляющие приложения
Структура приложения относительно проста. В наличие имеется модель данных, которая описывает сущность хранимую в базе данных (хранилище); контроллер, который облегчает взаимодействия между экраном (таблицей) и хранилищем данных; делегат приложения, который помогает инициализировать и запустить приложение.
На изображении представленном ниже показаны классы используемые в приложении и как они соотносятся друг с другом:
Обратите внимание на то, что класс MasterViewController содержит свойство, которое ссылается на экземпляр класса NSManagedObjectContext для взаимодействия с Core Data. Пройдясь по коду можно увидеть, что MasterViewController получает managed object context из свойства делегата приложения.
BasicApplication.xcdatamodel представляет собой директорию в файловой системе, которая содержит информацию о структуре модели данных. Модель данных является основой каждого приложения использующего Core Data.
Модель данных данного приложения описывает лишь одну сущность — Event. Сущность Event содержит лишь одно свойство (поле, атрибут) — timeStamp типа Date.
Сущность Event типа NSManagedObject, который считается основным для всех сущностей находящимся под управлением Core Data. Во второй главе мы рассмотрим тип NSManagedObject более подробно.
Извлечение/выборка данных
Следующим классом, который нас интересует, является MasterViewController. В его заголовочном файле описаны два свойства на которые мы обратим внимание:
NSFetchedResultsController представляет собой контроллер, предоставляемый фрэймворком Core Data для управления запросами к хранилищу.
NSManagedObjectContext является известной нам уже средой существования объектов типа NSManagedObject.
Реализация класса MasterViewController, которую можно найти в файле MasterViewController.m, показывает, каким образом можно взаимодействовать с Core Data для получения и хранения данных. В реализации класса MasterVIewController имеется явный геттер fetchedResultsController, который производит предварительную настройку запроса на выборку данных из хранилища.
Первым шагом к осуществлению запроса на выборку данных является создание запроса:
Результаты запроса могут быть отсортированы при помощи NSSortDescriptor. NSSortDescriptor определяет поле для сортировки и тип сортировки (по возрастанию или убыванию).
В нашем примере сортируем по убыванию времена создания записей:
После того, как запрос определен, мы можем приступить к созданию NSFetchedResultsController.
Используя в качестве делегата NSFetchedResultsController MasterVIewController мы можем следить за состоянием данных хранилища (удаление, добавление, перемещение и тд) и безболезненно интегрировать данное решение с UITableView. Мы можем конечно же получить те же результаты вызывая метод executeFetchRequest в managed object context, но в таком случае мы не получим и не сможем воспользоваться всеми преимуществами NSFetchedResultsController.
Создание и настройка переменной экземпляра класса NSFetchedResultsController:
Вы наверно заметили, что используемый ранее метод initWithFetchRequest имеет параметр cacheName. При передаче в качестве аргумента nil Вы исключаете возможность кэширования результата запроса, но при указании наименования кэша, вы позволяете Core Data проверить наличие такого же ранее осуществленного запроса и вернуть результат из кэша. В противном случае, если запроса с таким именем кэша нет, то будет осуществлен запрос к хранилищу и возвращены необходимые данные, которые будет закэшированы впоследствии.
В завершение нам осталось только выполнить запрос для получения данных:
Ниже вы можете ознакомиться с полным геттером fetchedResultsController:
NSFetchedResultsController представляет собой нечто вроде коллекции объектов типа NSManagedObject, для этого у него даже имеется свойства fetchedObjects типа NSArray для получения доступа к результатам запроса.
Класс MasterVIewController, который так же расширяет возможности UITableViewController, демонстрирует нам насколько удобно использовать NSFetchedResultsController для управления содержимым таблиц.
Вставка нового объекта
Быстро окинув взглядом метод insertNewObject: станет понятно, каким образом создаются и добавляются новые события в хранилище. NSManagedObject определяются описанием сущности из модели данных и могут существовать только в определенном контексте (среде). Первым шагом для создания нового объекта является получение контекста в котором этот объект будет создан:
Последним шагом, который необходимо осуществить, является сохранение контекста в котором был создан новый объект. Учтите, что при сохранении контекста все несохраненные ранее изменения будут сохранены.
Полный метод добавления нового объекта представлен ниже:
Инициализация контекста (среды)
Очевидно, что всё, что мы раньше делали не может быть достигнуто без создания объекта контекста, без той самой среды в которой существует и живет объект. Как раз за создание этой самой среды отвечает делегат приложения. Три свойства, которые должны быть обязательно в любом приложении использующем Core Data:
Обратите внимание на то, что все три свойства readonly, делается это для того, чтобы извне их нельзя было установить. Изучая BasicApplicationAppDelegate.m видно, что все три свойства имеют явные геттеры.
Managed Object Model:
После чего создается хранилище поддерживающее созданные модели данных. В нашем случае, собственно, как и в большинстве других с использованием Core Data, хранилище данных основывается на SQLite.
Создаём контекст (среду):
Контекст используется во всём приложении в качестве интерфейса для взаимодействия с Core Data и постоянным хранилищем.
Последовательность инициализации Core Data:
Механизм запускается при вызове метода application:didFinishLaunchingWithOptions:
Вызывая геттер свойства managedObjectContext делегата приложения на выполнение запускается цепочка действий:
— (NSManagedObjectContext *)managedObjectContext вызывает
— (NSPersistentStoreCoordinator *)persistentStoreCoordinator, который в свою очередь производит вызов
— (NSManagedObjectModel *)managedObjectModel.
Таким образом вызов геттер-метода managedObjectContext инициализирует весь стэк объектов Core Data и приводит Core Data в готовность.
Добавление Core Data в уже существующий проект
Добавление фрэймворка Core Data
Где производится добавление новых фрэймворков:
Выбираем фрэймворк для подключения:
Создание модели данных
Назовем нашу модель MyModel.xcdatamodeld:
После создания модели перед вами откроется окно редактирования (создания) сущностей.
Создать новую сущность можно кликнув на кнопку «+» в левой нижней части XCode, а добавить новый атрибут сущности можно нажав на кнопку «+» уже в разделе «Attributes» и затем выбрать его тип.
Инициализация контекста (среды)
Последний шаг состоит в инициализации контекста, хранилища и объектной модели. Чаще всего вы можете воспользоваться кодом, который автоматически генерируется XCode в «пустых» проектах использующих Core Data.
Переключимся в *.m файл DemoAppAppDelegate и напишем следующие строки:
Далее следует код, который производит инициализацию модели данных, хранилища и контекста.
Методы, которые ранее мы еще нигде не реализовывали:
Теперь, когда мы подключили Core Data, наше приложение может использовать его для хранения данных.
Давайте реализуем простой пример, который бы позволил нам убедиться в том, что всё работает так, как надо и данные действительно сохраняются.
В тестовом примере мы будем определять кол-во раз, которое было запущено наше приложение.
Внесём маленькие изменения в метод application:didFinishLaunchingWithOptions: делегата приложения в виде получения кол-ва раз, которое приложения запускалось ранее и добавление нового события запуска.
Код для получения предыдущих запусков приложения:
После чего мы можем пройтись по всему массиву следующим образом:
Добавим новую запись и сохраним:
После первого запуска приложение выведет в консоль следующую строку:
После второго запуска:
Полный метод выглядит следующим образом:
В завершение
Прошу об ошибках не писать в комментариях, лучше сразу в личные сообщения.
Продолжать ли переводы? Есть ли интерес к данной теме?
Core Data и Swift: стек технологий Core Data
Введение
Core Data вокруг нас в течение многих лет. Он используется в тысячах приложений миллионами людей, как на iOS, так и на OS X. Core Data поддерживается Apple и очень хорошо документирован. Это зрелый фреймворк, который доказывает свою эффективность снова и снова.
Несмотря на то, что Core Data опирается в большей степени на Runtime Objective-C и искусно интегрирован с Core Foundation, вы можете его легко использовать в своих Swift-проектах. В результате, это простой в использовании фреймворк для управления объектным графом, элегантный в использовании и крайне эффективный в плане потребления памяти.
1. Необходимый минимум
Core Data не сложен сам по себе, но если вы новичок в разработке под iOS или OS X, то я рекомендую вам сначала ознакомиться с серией статей, посвященных iOS-разработке. Вы освоите основы iOS-программирования и, в конце серии [статей], вы будете иметь достаточно знаний, чтобы взяться за более сложные темы, такие как Core Data.
Как я уже сказал, Core Data не так сложна и трудна для использования, как думают большинство разработчиков. Однако, я усвоил, что прочный фундамент критически важен для быстрого старта с Core Data. Вам нужно иметь правильное понимание Core Data API, чтобы избежать его некорректного применения и убедится, что вы не столкнетесь с проблемами используя этот фреймворк.
Каждый компонент Core Data имеет конкретное предназначение и функциональность. Если вы попытаетесь использовать Core Data не так, как он был задуман, то, в конечном итоге, вы неизбежно окажетесь в бедственном положении.
То, что я расскажу в этой серии про Core Data применимо в отношении iOS 7+ и OS X 10.10+, но основное внимание будет уделяться iOS. В этой серии [статей] я буду работать с Xcode 7.1 и Swift 2.1. Если вы предпочитаете Objective-C, то я рекомендую прочитать мою предыдущую серию статей про Core Data.
2. Кривая обучения
Core Data может показаться сложным на первый взгляд, но после того, как вы поймете каким образом разные кусочки мозаики складываются в единое целое, его API становится интуитивно понятным и лаконичным. Именно по этой причине у большинства разработчиков возникают проблемы с этим фреймворком. Они пытаются использовать Core Data, не увидев картину в целом, они не знают как различные кусочки мозаики собрать воедино и как они связаны друг с другом.
В этой статье я познакомлю вас со стеком технологий Core Data. Поняв однажды ключевые моменты Core Data, вы почувствуете себя увереннее и даже оцените и полюбите хорошо продуманное API этого фреймворка.
В отличие от таких фреймворков как UIKit, который можно использовать без его исчерпывающего знания, Core Data требует правильного понимания всех его конструктивных элементов. Очень важно выделить некоторое время для знакомства с этим фреймворком, что мы и сделаем в этом руководстве.
3. Что такое Core Data?
Зачастую новички ошибочно считают, что Core Data работает как база данных. Если есть одна вещь, которую, я надеюсь, вы запомните из этой серии статей, то это то, что Core Data не является базой данных, и вам не следует ждать, что он будет работать аналогичным образом.
4. Стек технологий Core Data
Как я упоминал ранее, стек технологий является сердцем Core Data. Это коллекция объектов, которые являются как-бы чехлом Core Data. Ключевыми объектами стека являются: managed object model (управляемая объектная модель), persistent store coordinator (координатор постоянного хранилища) и одного или нескольких managed object contexts (контекстов управляемого объекта). Давайте кратко рассмотрим каждый компонент.
NSManagedObjectModel
Управляемая объектная модель (managed object model) олицетворяет модель данных приложения. Несмотря на то, что Core Data не является базой данных, вы можете сравнить управляемую объектную модель (managed object model) со схемой базы данных, то есть, она содержит информацию о моделях или сущностях графа объекта, какие атрибуты они имеют, и как они связаны друг с другом.
Объект NSManagedObjectModel узнает о модели данных путем загрузки одного или нескольких файлов модели данных во время инициализации. Мы посмотрим как это работает чуть позже.
NSPersistentStoreCoordinator
Как и говорит его название, объект NSPersistentStoreCoordinator сохраняет данные на диск и гарантирует, что постоянное хранилище(-а) и модель данных являются совместимыми. Это посредник между постоянным хранилищем(-ами) и контекстом(-ами) управляемого объекта, также он заботится о загрузке и кэшировании данных. Это действительно так. Core Data имеет встроенный механизм кэширования.
NSManagedObjectContext
Хотя управляемая объектная модель и координатор постоянного хранилища могут совместно использоваться несколькими потоками, контекст управляемого объекта никогда не должен быть доступен из другого потока, отличного от того, в котором он был создан. Мы будем обсуждать многопоточность более подробно в следующих статьях этой серии.
5. Изучение стека технологий Core Data
Шаг 1: Настройка проекта
Давайте рассмотрим стек технологий Core Data более подробно на примере. Создайте новый проект в Xcode 7, выбрав New > Project. из меню File. Выберете шаблон Single View Application в разделе iOS > Application (слева).
Шаг 2: Обзор
В самом верху AppDelegate.swift вы должны увидеть оператор import для фреймворка Core Data.
Кроме того, класс AppDelegate содержит четыре lazy (ленивых) хранимых свойства:
Шаг 3: Контекст управляемого объекта
Таким образом, контекст управляемого объекта управляет коллекцией объектов модели, экземплярами класса NSManagedObject и хранит ссылку на координатор постоянного хранилища. Имейте это в виду при чтении остальной части этой статьи.
Шаг 4: Координатор постоянного хранилища
Как правило, вам захочется хранить граф объектов Core Data на диске и реализация свойства persistentStoreCoordinator от Apple использует для этого базу данных SQLite. Это общий сценарий для приложений, использующих Core Data.
Как вы видите, создание объекта NSPersistentStoreCoordinator происходит довольно просто. Однако, координатор постоянного хранилища малополезен, если он не имеет какого-нибудь постоянного хранилища, которым может управлять. В оставшейся части замыкания мы попытаться загрузить постоянное хранилище и добавить его к координатору постоянного хранилища.
Во-первых укажем тип хранилища, NSSQLiteStoreType в этом примере. Core Data также поддерживает бинарные (двоичные) хранилища ( NSBinaryStoreType ) и хранилище типа in-memory ( NSInMemoryStoreType ).
Шаг 5: Управляемая объектная модель
Эта реализация очень проста. Мы сохраняем расположение модели приложения в modelURL и используем его при создании экземпляра модели управляемого объекта.
В этом месте, вы, наверно, задаете себе вопрос, на какую модель указывает modelURL и что это за файл с расширением .momd. Чтобы ответить на эти вопросы, мы должны выяснить, что еще Xcode создал для нас при настройке проекта.
В Навигаторе проекта (Project Navigator), слева, вы должны видеть файл с именем Core_Data.xcdatamodeld. Это модель данных приложения, которая компилируется в .momd-файл. Это именно тот .momd-файл, который использует управляемую объектную модель для создания модели данных приложения.
Это позволяет иметь несколько файлов модели данных. Класс NSManagedObjectModel вполне способен объединить множество моделей данных в одну, что является одной из наиболее мощных и продвинутых функций Core Data.
Также Core Data поддерживает версионирование модели данных, в том числе при миграции. Это гарантирует, что данные, хранящиеся в постоянном хранилище(-ах) останутся целыми. Версионирование и миграция будут рассмотрены в следующих статьях этой серии.
На данный момент, файл модели данных в вашем проекте пуст, что означает, что ваша модель данных не содержит никаких сущностей. Мы исправим это в следующем статье, которая будет посвящена исключительно модели данных.
6. Собирая все вместе
Прежде чем мы закончим эту статью, я бы хотел показать вам схему, которая иллюстрирует три компонента стека Core Data.
Контекст управляемого объекта запрашивает данные у координатора и говорит ему, когда необходимо их сохранить. Все это делает для вас Core Data, вашему приложению довольно редко нужно будет общаться напрямую с координатором постоянного хранилища.
Заключение
В этой статье мы рассмотрели ключевые составляющие стека технологий Core Data: координатор постоянного хранилища, управляемая объектная модель и контекст управляемого объекта. Убедитесь, что вы понимаете роль каждого компонента и, что более важно, как они работают вместе, создавая магию Core Data.
В следующем выпуске этой серии мы более подробно поговорим о моделе данных. Мы рассмотрим редактор модели данных в Xcode и создадим несколько сущностей, атрибутов и взаимосвязей.