Введение

Core Data — это объектный граф и фреймворк постоянного хранения данных, предоставляемый Apple в операционных системах macOS и iOS. Он был представлен в Mac OS X 10.4 Tiger и iOS с iPhone SDK 3.0. Он позволяет сериализовать данные, организованные по реляционной модели сущность-атрибут, в хранилища XML, бинарные или SQLite. Данными можно управлять, используя объекты более высокого уровня, представляющие сущности и их взаимосвязи. Core Data управляет сериализованной версией данных, обеспечивая жизненный цикл объектов и управление объектными графами, включая постоянное хранение. Core Data напрямую взаимодействует с SQLite, ограждая разработчика от базового SQL. Подобно тому, как Cocoa Bindings берет на себя многие обязанности контроллера в архитектуре «модель-представление-контроллер», Core Data берет на себя многие обязанности модели данных. Среди прочих задач, он обрабатывает управление изменениями, сериализацию на диск, минимизацию занимаемой памяти и выполнение запросов к данным.

Форматы хранения

Core Data может сериализовать объекты в XML, двоичный формат или SQLite для хранения. Схемы данных Core Data стандартизированы. Если у вас есть файл модели данных Xcode, вы можете свободно читать и записывать файлы в этом формате. Однако, в отличие от EOF, Core Data в настоящее время не рассчитана на многопользовательский или одновременный доступ, если вы не используете фреймворк ODBC. Миграция схемы также является непростой задачей и почти всегда требует написания кода. Если другие разработчики имеют доступ к вашей модели данных и зависят от неё, при изменении схемы вам может потребоваться предоставить код преобразования версий в дополнение к новой модели данных.

История и генезис

Core Data во многом обязан своим дизайном более раннему продукту NeXT, Enterprise Objects Framework (EOF). EOF был объектно-реляционным отображением для высокопроизводительных СУБД SQL, таких как Microsoft SQL Server и Oracle. Цель EOF была двойной: во-первых, обеспечить подключение к движку базы данных и скрыть детали реализации; во-вторых, извлекать данные из реляционного формата и преобразовывать их в набор объектов. Разработчики обычно взаимодействовали только с объектами, что упрощало разработку сложных программ, но требовало определенной настройки для сопоставления данных с объектами. Объектная модель EOF была намеренно разработана таким образом, чтобы результирующие программы работали подобно документу: пользователь мог редактировать данные локально в памяти, а затем записывать все изменения одной командой "Сохранить". На протяжении всей своей истории EOF содержал ряд полезных фрагментов кода, недоступных в NeXTSTEP/OpenStep. Например, EOF требовал возможности отслеживать "грязные" объекты, чтобы система могла впоследствии их записать. Это было представлено разработчику не только как система, подобная работе с документом, но и в виде неограниченного стека команд "Отменить", где каждая команда, применяемая к данным, представляла собой отменяемое действие. Многие разработчики жаловались, что этот код управления состоянием был слишком полезен, чтобы быть изолированным в EOF, и позже он был перенесен в Cocoa API во время перехода на Mac OS X. Изначально сам EOF не был переведен. EOF использовался в основном вместе с другим продуктом эпохи OpenStep, WebObjects, который являлся сервером приложений, изначально основанным на Objective-C. В то время Apple переносила WebObjects на язык программирования Java, и в рамках этого преобразования работа с EOF из Cocoa стала значительно сложнее. Вновь возникли многочисленные жалобы со стороны сторонних разработчиков. Важным осознанием стало то, что система управления состоянием объектов в EOF на самом деле не имела отношения к реляционным базам данных. Тот же код мог быть и использовался разработчиками для управления графами других объектов. В этом качестве наиболее полезными частями EOF были те, которые автоматически создавали наборы объектов из исходных данных и затем отслеживали их. Именно эта концепция лежит в основе Core Data.