Sqlite DB to-do во время обновления приложения iphone

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

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

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

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

Ответ 1

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

  • Да.

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

Чтобы проверить версии:

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

Для обновления:

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

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

Ответ 2

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

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

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

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

Ответ 3

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