Основные данные против SQLite 3 [закрыто]

Я уже хорошо знаком с реляционными базами данных и использовал SQLite (и другие базы данных) в прошлом. Однако,Основные Данные имеет определенное очарование, поэтому я рассматриваю возможность потратить некоторое время, чтобы узнать его для использования в моем следующем приложении.

есть ли большая польза от использования основных данных через SQLite или наоборот? Каковы плюсы / минусы каждого из них?

Мне трудно оправдать стоимость обучения Core Data, когда Apple не использует его для многих из его флагманских приложений, таких как Mail.app или iPhoto.app-вместо этого выбор для баз данных SQLite. SQLite также широко используется на iPhone.

могут ли те, кто знаком с использованием обоих, прокомментировать свой опыт? Возможно, как и в большинстве случаев, вопрос глубже, чем просто использование одного над другим?

4 ответов


хотя Core Data является потомком Apple Enterprise Object Framework, объектно-реляционный сопоставитель (ORM), который был / тесно связан с реляционным бэкэндом, Core Data -не ОРМ. Это, по сути, структура управления графами объектов. Он управляет потенциально очень большим графом экземпляров объектов, позволяя приложению работать с графом, который не будет полностью вписываться в память, отбрасывая объекты в память и из памяти по мере необходимости. Core Data также управляет ограничения на свойства и отношения и поддерживает целостность ссылок (например, сохраняя согласованность прямых и обратных ссылок, когда объекты добавляются/удаляются в/из отношения). Таким образом, Core Data является идеальной основой для построения "модельного" компонента архитектуры MVC.

для реализации управления графом, Core Data происходит использовать SQLite в качестве хранилища дисков. Это может были реализованы с использованием другой реляционной базы данных или даже нереляционная база данных, такая как CouchDB. Как указывали другие, Core Data также может использовать XML или двоичный формат или написанный пользователем атомарный формат в качестве бэкэнда (хотя эти параметры требуют, чтобы весь граф объектов помещался в память). Если вас интересует, как основные данные реализуются на бэкэнде SQLite, вы можете проверить OmniDataObjects framework, реализация с открытым исходным кодом подмножества API основных данных. Этот BaseTen framework также является реализацией API основных данных с использованием PostgreSQL в качестве бэкэнда.

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

таким образом, на самом деле нет никакого конфликта между использованием основных данных или SQLite напрямую. Если вы хотите реляционную базу данных, используйте SQLite (напрямую или через одну из оболочек Objective-C, таких как FMDB по) или сервер реляционной базы данных. Тем не менее может потребоваться изучить основные данные для использования в качестве структуры управления графами объектов. В сочетании с классами контроллеров Apple и совместимыми виджетами представления привязки ключевых значений вы можете реализовать полную архитектуру MVC с помощью очень маленький код.


и с iOS 5.0 вы получаете дополнительное преимущество в возможности использовать iCloud file-sync бесплатно, если вы используете основные данные. Если вы используете SQLite напрямую, это должно быть много ручной работы и реализации, чтобы синхронизировать его через iCloud.


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

Я бы рекомендовал изучать основные данные, так как это отличный ресурс, который значительно ускоряет многие части разработки приложений cocoa.


SQLite является одним из форматов базы данных для основных данных. Используя основные данные, вы получаете лучшую интеграцию с остальной частью API Cocoa.