Обновите/вставьте содержимое в существующую базу данных Sqlite в обновлении приложения для iPhone.

Здесь я рассмотрел другие вопросы аналогичного характера, но все они связаны с заменой предыдущей базы данных sqlite при обновлении приложения. Я делал это для всех предыдущих приложений, поскольку они носили справочный характер, и достаточно было простой замены.

Это конкретное приложение, с которым я работаю, представляет собой игру-викторину, и счет должен поддерживаться. На данный момент есть 4 уровня с примерно 15 вопросами, и в более позднем обновлении их может быть больше. Поскольку я никогда не делал этого раньше, мне любопытно, и я намерен сделать это правильно с первого раза. Итак, вот мои запросы:

  1. Каков предпочтительный способ обновления контента, который рекомендуют гуру SO? Должен ли он иметь номер версии (возможно, в самой БД) и при первом запуске нового приложения новый контент вставляется в таблицу?
  2. Каков предпочтительный способ хранения запросов на вставку? Должны ли они быть жестко закодированы в файле реализации?

PS. Я копирую базу данных в каталог Documents, поэтому она сохраняется при обновлении приложения.

РЕДАКТИРОВАТЬ: я должен был добавить, что приложение викторины является своего рода копией «викторины логотипов», в которой необходимо поддерживать баллы (или статус вопроса, на который будет дан ответ/без ответа) всех вопросов. Итак, в первой версии 60 вопросов, и их статусы меняются по мере того, как пользователь отвечает на них.

РЕДАКТИРОВАТЬ 2: Это структура таблицы, которая меня больше всего беспокоит, таблица вопросов:

_id (целое число, ПЕРВИЧНЫЙ ключ), levelId (целое число), QuestionImage (Varchar), CorrectAnswer (Varchar), boolAnsweredCorrectly (целое число).

Викторина похожа на Logos Quiz. Есть изображение, и пользователь должен ввести ответ. Если введенный ответ соответствует правильному ответу в БД, для boolAnsweredCorrectly устанавливается значение true. Меня больше всего беспокоит boolAnsweredCorrectly (что может быть 0 или 1 в зависимости от результата).

РЕДАКТИРОВАТЬ 3: Когда я говорю о вставке данных при обновлении приложения, я имею в виду это. Предположим, в первой версии было 60 вопросов. Во второй версии добавлено 40 новых вопросов. Таким образом, когда пользователь обновляет приложение до второй версии, в таблицу вопросов необходимо вставить новые 40 вопросов. Это должно быть добавлено таким образом, чтобы предыдущие 60 вопросов не перепутались и остались нетронутыми.


person bizsytes    schedule 23.08.2012    source источник


Ответы (2)


Каков предпочтительный способ обновления контента, который рекомендуют гуру SO? Должен ли он иметь номер версии (возможно, в самой БД) и при первом запуске нового приложения новый контент вставляется в таблицу?

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

Я лично использую поле database_version в таблице configuration с форматом "major.minor.revision", где major или minor предполагают изменения базы данных, которые требуют обновления базы данных, тогда как изменения revision этого не требуют). Но я использую эту систему нумерации версий базы данных, чтобы знать, хочу ли я перекопировать базу данных моего пакета в Documents или нет (но я делаю это только для структурных изменений в моей базе данных и предпочитаю получать новые данные через интерфейс сервера, но это зависит от того, как ваше решение разработано). Если вы программно определили, что хотите снова скопировать базу данных, если у вас есть какие-либо данные, которые необходимо сохранить, с точки зрения Retterdesdialogs, вы можете сохранить любые данные из своей старой базы данных в новую базу данных.

Каков предпочтительный способ хранения запросов на вставку? Должны ли они быть жестко закодированы в файле реализации?

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

Лично я больше склоняюсь к

  • поместите свои последние и лучшие вопросы в базу данных в вашем пакете
  • иметь приложение для проверки версии версии базы данных Documents по сравнению с тем, что ожидало приложение,
  • если отличается (а) сохранить старые ответы пользователя; (b) скопировать новую базу данных из пакета в Documents; и (c) обновить ответы в новой базе данных на основе ответов из старой базы данных.

Вы, конечно, могли бы сделать что-то программно, вставляя записи, но только представьте, какой будет жизнь, когда вы доберетесь до 20-го выпуска вашего приложения, и вам придется иметь тонны условной логики о том, что вставлять на основе того, что предыдущая версия приложение было (потому что вы не можете предположить, что у пользователя всегда будет предыдущая версия... они могут быть на несколько версий устаревшими). И становится еще сложнее, когда вы рассматриваете каждую версию как комбинацию добавления, удаления и изменения вопросов.

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

В качестве альтернативы, и я подозреваю, что это больше, чем вы хотите откусить, вы можете рассмотреть возможность использования Core Data, предпочтительной модели постоянного хранилища iOS. Похоже, проблема миграции решена, как описано в Управление версиями базовой модели данных и миграция данных. Я никогда не использовал возможности миграции/версионирования Core Data (исторически я всегда сворачивал свои собственные), но это выглядит многообещающе.

person Rob    schedule 23.08.2012
comment
Большое спасибо за подробный ответ. См. Edit 2 в моем вопросе о структуре таблицы. - person bizsytes; 23.08.2012
comment
Роб, у вас очень правильный вопрос относительно операторов INSERT. См. Редактирование 3 в вопросе для уточнения. - person bizsytes; 23.08.2012
comment
@bizsytes Соответственно обновил мой ответ. Спасибо за разъяснения. - person Rob; 23.08.2012
comment
Роб, ваш 20-й выпуск комментария к вашему приложению — серьезная пища для размышлений, я никогда об этом не думал :| Большое спасибо за то, что подняли его! - person bizsytes; 23.08.2012

Я бы сделал что-то вроде этого в псевдокоде:

// if old database exists in documents directory
// get scores
// delete old database
// copy the new database from bundle to documents directory
// update scores in the new database

Чтобы проверить, является ли старая база данных старой, вы можете проверить имя или что-то вроде «есть вопросы == 15»

person Retterdesdialogs    schedule 23.08.2012
comment
Спасибо за ваш ответ. Я должен был добавить, что приложение викторины является своего рода копией логотипов викторины, в которой необходимо поддерживать баллы (или статус вопроса, на который будет дан ответ/без ответа) всех вопросов. Итак, в первой версии 60 вопросов, и их статусы меняются по мере того, как пользователь отвечает на них. Вы бы по-прежнему предлагали ту же методологию в своем ответе для такого рода обновлений? - person bizsytes; 23.08.2012
comment
Ох, хорошо. Затем я бы проверил, существует ли старая база данных (вопросы == 60) в каталоге, и обновил бы старую базу данных с помощью операторов обновления из файла. - person Retterdesdialogs; 23.08.2012