Задача sqlite DB во время обновления приложения для iphone - PullRequest
10 голосов
/ 10 ноября 2010

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

  1. При новом обновлении существующая база данных sqlite перезаписывается копией нового?

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

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

Ответы [ 3 ]

20 голосов
/ 10 ноября 2010
  1. Заменяются только файлы внутри пакета приложения. Если файл базы данных находится в каталоге документов вашего приложения, он не будет заменен. (Обратите внимание, что если вы измените файлы внутри пакета приложения, подпись кода больше не будет действительной и приложение не запустится. Поэтому, если вы не используете базу данных только для чтения, она должна находиться в каталоге Documents.)

  2. Да.

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

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

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

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

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

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

1 голос
/ 10 ноября 2010

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

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

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

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

0 голосов
/ 10 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...