Подтвердить что ты не робот

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

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

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

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

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

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

Ответ 1

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

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

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

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

Ответ 2

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

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

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

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

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

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

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

Ответ 3

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

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

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

= Майк