2013-03-18 4 views
0

Я хочу добавить таблицы/столбцы в базу данных во время выполнения. В настоящее время я использую основные данные. Я знаю, что есть возможность сделать это в XCode (добавить новую версию модели данных), но я определенно не могу использовать этот путь, потому что я получаю схему базы данных из веб-службы.iOS: Команды DDL во время выполнения

Есть ли хорошая возможность запускать команды ddl во время выполнения при использовании Core Data, или это просто возможно с помощью прямого использования sqlite (или оболочки/ormapper)? Если лучше использовать обертку/ormapper, пожалуйста, дайте мне несколько советов о том, какие из них следует использовать в этом случае.

Workflow должно быть:

  1. запуск приложения
  2. проверить, если база данных находится в актуальном состоянии
  3. , если новая версия схемы доступна из веб-службы делают DDL команды
  4. продолжить приложение рабочего процесса

PS: Пожалуйста, никаких ответов, которые описывают альтернативы, изменяющие схему с помощью XCode!

+0

Вы хотите изменить модель данных, которую использует Core Data, или что-то еще? Вы говорите «база данных», которая звучит так, будто вы имеете в виду что-то вне Core Data, но это не ясно. –

+0

К сожалению, я хочу изменить базовую модель данных – user2181824

ответ

1

Можете ли вы изменить модель Core Data во время выполнения? Да ... но, возможно, он не будет работать так, как вы хотите, чтобы он работал.

API-интерфейс Core Data позволяет создавать или изменять каждую деталь модели данных во время выполнения. Редактор модели Xcode - это удобство, но вы можете пропустить его и сделать все в коде, если хотите. Например, атрибут NSEntityDescriptionproperties (который охватывает оба атрибута и отношения) можно записать. Вы можете создать новый NSAttributeDescription и обновить свойства объекта, чтобы его содержать. Bang, вы просто добавили новый атрибут для объекта. Аналогично, 's entities свойство можно записать, поэтому вы можете создать новый NSEntityDescription и добавить его в модель. Это дает вам новый объект, созданный во время выполнения.

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

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

С основными данными модель (схема) и данные хранятся отдельно и сопоставляются при загрузке магазина. Это не то, как SQLite работает внутри, но это подход, который обеспечивает Core Data.