2010-11-09 2 views
10

У меня есть некоторые общие вопросы об обновлениях приложений iphone, которые включают sqlite db.sqlite DB to-do во время обновления приложения iphone

  1. С новым обновлением существующий sqlite db получает перезапись с копией нового?

  2. Если обновление не связано с изменениями схемы, пользователь должен иметь возможность повторно использовать существующую базу данных с сохраненными данными, не так ли? (если существующая база данных не будет перезаписана из 1 выше)

  3. Если есть какие-либо изменения схемы, как лучше всего перенести данные из старой базы данных в новую? Может кто-нибудь, пожалуйста, дайте мне рекомендации и пример кода?

+0

Также отличный ответ: http://developer.appcelerator.com/question/127927/will-app-store-update-force-update-of-the-sqlite-database-too# – OneWorld

ответ

20
  1. Только файлы внутри пакета приложений заменены. Если файл базы данных находится в папке «Документы» вашего приложения, он не будет заменен. (Обратите внимание: если вы измените файлы внутри своего пакета приложений, подпись кода перестанет быть действительной, и приложение не будет запущено. Поэтому, если вы не используете базу данных только для чтения, это должно быть в каталоге «Документы».)

  2. Да.

  3. Что лучше всего зависит от данных. Вы не найдете образец кода для такого общего вопроса. Во-первых, вам нужно обнаружить, что ваше приложение работает со старой версией DB. Затем вам нужно его обновить.

Для проверки версии:

  • Вы можете использовать другое имя файла для новой схемы. Если Version2.db не существует, но Version1.db делает, выполните обновление.
  • Вы можете встроить версию схемы в свою базу данных. У меня есть стол metadata с колонками name и value. Я использую это для хранения некоторых общих значений, включая номер dataversion. Я проверяю этот номер при открытии базы данных, и если она меньше текущей версии, я выполняю обновление.
  • Вместо создания таблицы вы также можете использовать встроенный user_version pragma sqlite для проверки и хранения номера версии.
  • Вы можете напрямую проверить структуру таблицы: искать наличие столбца или таблицы.

Обновление:

  • Вы могли бы модернизировать на месте с помощью последовательности команд SQL. Вы даже можете хранить файл SQL внутри своего пакета приложений в качестве ресурса и просто передать его sqlite3_exec, чтобы выполнить всю работу. (Делайте это внутри транзакции, если есть проблема!)
  • Вы можете обновить, скопировав данные из одного файла базы данных в новый.

Если ваше обновление может длиться долго (более одной секунды), вы должны отобразить экран обновления, чтобы объяснить пользователю, что происходит.

+2

Незначительное примечание по проверке версии: вместо использования отдельной таблицы для версии схемы вы также можете использовать встроенную прагму «user_version» (http://www.sqlite.org/pragma.html#pragma_schema_version). –

+0

О, круто! Хотел бы я знать об этом. Изменит мой ответ. – benzado

+0

Спасибо за подробное объяснение ... – iOSAppDev

1

1) Файл базы данных не сохраняется как часть пакета приложений, так что нет, он не будет автоматически перезаписан.

2) Да - все их данные будут сохранены. Фактически, база данных не будет затронута вообще обновлением.

3) Это сложный вопрос - прочитайте this fantastically interesting document - особенно часть облегченной миграции - если ваши изменения схемы небольшие и следуют определенному набору правил, они будут выполняться автоматически, и пользователь не заметит. однако, если они являются серьезными изменениями в схеме, вам придется написать свой собственный код перехода (это также в этих ссылках).

Мне всегда удавалось справляться с легкими миграциями - это намного проще, чем делая это самостоятельно.

+1

Ссылка только на # 3 применяется для использования Core Data. Представляется, что вопрос заключается в непосредственном использовании SQLite. – benzado

+0

документ относится к миграции данных с использованием основных данных ... Я ищу что-то вроде прямой передачи данных из sqlite db (новый db) из sqlite db (существующий с данными пользователей) – ArdenDev

0

Что я делаю, так это то, что я создаю рабочую копию базы данных в каталоге «Документы». Основная копия поставляется с комплектом. Когда я обновляю приложение, у меня есть возможность сделать новую копию поверх рабочей копии или оставить ее.

+0

Что делать, если вам нужно перенести данные на новый копировать? есть ли примеры сценариев миграции, на которые вы можете указать мне? – ArdenDev

+0

Обычно я запускаю две базы данных, статические, которые хранят все относительно статические таблицы и динамические. Таким образом, миграция, как правило, не является проблемой, потому что я обновляю только требуемую базу данных. Миграция не была проблемой. –

Смежные вопросы