Core Data и SQLite для опытных разработчиков SQL

Мы начинаем разработку собственного приложения в программе разработчика iPhone Enterprise. Поскольку он близок к ОС 3.0, мы пересматриваем наш оригинальный дизайн с использованием SQLite и вместо этого используем Core Data. Вот еще информация:

  • Существует устаревшее настольное приложение, которое это заменяет. Мы будем повторно использовать существующий задний конец.
  • В настоящее время у нас есть firebase database SQLite, созданная в качестве доказательства концепции. В основном это сокращенная версия существующей базы данных заднего плана.
  • Мы будем загружать данные с удаленного сайта и хранить его локально, где он будет сохраняться и должен быть. Мы обновляем его только в том случае, если он изменился, и каждый месяц или два. Скорее всего, мы будем использовать XML или JSON для передачи данных.
  • В этом проекте есть два разработчика, и у нас есть сильные навыки SQL, но ни один из них не использовал Core Data.

Мои вопросы: какова польза Core Data над SQLite, какова будет польза в этом конкретном случае и какие преимущества оправдывают изучение новой структуры вместо использования существующих сильных навыков SQL?

EDIT: Я только заметил этот вопрос: Core Data vs SQLite 3 . Я думаю, что мои вопросы:

  • Если мне нужно проверить, существует ли какой-либо конкретный элемент или есть обновление, которое легко использовать с SQL, действительно ли имеет значение Core Data? Можно ли загрузить первый объект в графе и проверить номер версии без загрузки всего графика?
  • Если мы уже знаем SQL, действительно ли преимущества Core Data для этого одного проекта оправдывают нас, изучая его?

Когда вы читали Core Data vs SQLite 3 , вы знаете, что Core Data и механизм персистентности (SQLite в этом случае) в основном ортогональны. Основные данные действительно касаются управления графом объектов, и его основным вариантом использования является модельный компонент архитектуры MVC. Если ваше приложение хорошо вписывается в эту архитектуру, вероятно, стоит использовать Core Data, так как это сэкономит вам много кода в компоненте модели. Если у вас уже есть рабочий компонент модели (например, из существующего настольного приложения), то Core Data не будет покупать вас много. Гибридный подход возможен – вы можете выполнить свою собственную персистентность / запрос и построить core data в хранилище данных, которые вы заполняете результатом запроса, и использовать это хранилище в памяти через Core Data в качестве компонента модели для вашего приложения. Это не распространено, но я сделал это, и нет никаких важных препятствий.

Чтобы ответить на ваши конкретные вопросы:

  1. Вы можете назначить номер версии для всего постоянного хранилища и получить эту информацию через +[NSPersistentStore metadataForPersistentStoreWithURL:error:] , даже не открыв хранилище. Например, эквивалент +setMetadata:forPersistentStoreWithURL:error . Если вы хотите сохранить информацию о версии в экземпляре объекта, а не в метаданных постоянного хранилища, вы можете загрузить только один объект. Благодаря постоянному хранилищу SQLite Core Data делает очень хорошую работу по извлечению только того, что вам нужно.

  2. API NSPredicate очень прост в освоении и, похоже, делает достойную работу по компиляции SQL. По крайней мере, для баз данных такого размера, которые вы могли бы поместить на iPhone, это, безусловно, было адекватным (с точки зрения производительности) в моем опыте. Тем не менее, я думаю, что вопрос SQL vs. Core Data немного ошибочен. Как только вы получите результат запроса, что вы собираетесь с ним делать? Если вы откажетесь самостоятельно, вам придется создавать объекты, обрабатывать ошибки / уникальность (если вы не хотите сразу загрузить весь результат запроса в память) и все другие средства управления объектом, уже предоставленные Core Данные.

Похоже, у вас уже есть проект, разработанный с использованием SQLite, и у вас есть опыт в этой области.

Итак, в итоге, имеет смысл ли порт для этого проекта, будут ли Core Data давать мне все, что у меня еще не было в моем оригинальном дизайне?

Предполагая, что первоначальный дизайн был выполнен правильно, в соответствии с требованиями НА ЭТОМ ПРОЕКТЕ, это, вероятно, не стоит.

Но это еще не конец дискуссии. Есть и другие вещи, о которых нужно подумать: будет ли в моем следующем проекте такие легкие требования к базе данных? Нужно ли мне скоро отправить груз из-за временных ограничений или бюджетных ограничений? Предполагая, что мне придется рано или поздно изучить Core Data, не имеет смысла делать это сейчас? Возможно, мне интересен перенос моего кода на Mac?

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

Чтобы ответить на ваш последний вопрос: каковы преимущества? Ну, Core Data – это абстракция вашей базы данных на более высоком уровне, это также агностик для хранения данных (так что если будущая версия iPhone должна была вырезать SQLite для встроенной версии MySQL … вряд ли, но это пример), то Core Данные потребовали бы ОЧЕНЬ немного изменений кода, чтобы заставить его работать с новым хранилищем данных. Core Data обеспечит большую мобильность на платформе Mac. Core Data будет обрабатывать версию вашей модели данных, тогда как если у вас нет frameworks или рабочего процесса для ее управления, прямой доступ к SQLite не будет.

Я уверен, что другие ответчики могут придумать другие преимущества и, возможно, некоторые веские причины, по которым НЕ следует возиться с Core Data. Кстати, в подобной ситуации мое решение состояло в том, чтобы перенести на более высокий уровень, более новые frameworks. Но в моем случае это было для побочного проекта, а дата отправки и бюджет были не-факторами.

Не отвлекать от этого форума, но вы можете найти больше респондентов с контекстуальным опытом в Apple iPhone DevForum.

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

При этом CoreData основывается на SQLite, и если вы пытаетесь использовать другие части системы в сочетании с вашими данными, например, используя KVC / KVO или привязки, вы можете быстро обнаружить, что эта функциональность стоит кривой обучения.

= Майк

Давайте будем гением компьютера.