Проверьте, содержит ли локальная база данных (websql) нужные новые поля, и добавьте их, если нет

Я создаю кроссплатформенное приложение HTML/Javascript для iOS и Android, используя PhoneGap и jQueryMobile, и я обновляю свое приложение (среди прочего) несколькими новыми полями в одной таблице локальной базы данных (localdatabase/websql).

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

Предыстория: в моем приложении есть локальная база данных пользователя (доходы и расходы, а также несколько настроек). Эти данные должны быть постоянными, и когда я начинал, я использовал функциональность HTML5 localDatabase, поскольку она является постоянной и доступна для браузеров iOS и Android, а также для большинства настольных браузеров.

Я использую плагин/библиотеку/штуку Javascript под названием persistenceJS, чтобы немного упростить работу с локальной базой данных. Но мой вопрос на самом деле не относится к persistenceJS.

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

Как мне сделать это тестирование? Я вижу два направления мысли:

  1. Используйте метку базы данных... которая используется в функции openDatabase. Кажется, это используется некоторыми разработчиками для хранения номера версии. Моя проблема с этой опцией заключается в том, что я знаю, как использовать openDatabase только для того, чтобы открыть базу данных (и создать новую, если ее не существует) и запустить обратный вызов, если база данных еще не существует. Итак, если я открою таблицу, указав в метке что-то вроде «v2», будет ли создана новая таблица? Если да, то скопирует ли он значения старой таблицы в новую?

  2. Проверьте наличие полей таблицы... Я мог бы использовать openDatabase, а затем проверить наличие полей таблицы. Если их нет, я могу их добавить. Тест будет запускаться каждый раз, когда пользователь открывает свое приложение, что кажется немного примитивным.

Между прочим: я знаю, что webSQL/localDb устарела повелителями, но это все еще мой инструмент, и я хочу пока придерживаться его.


person Wytze    schedule 06.06.2012    source источник


Ответы (2)


Я нашел ответ здесь: http://blog.maxaller.name/2010/03/html5-web-sql-database-intro-to-versioning-and-migrations/.

По сути, вы просто применяете метод changeVersion со старой и новой меткой версии. Если у вас не было метки, то старая метка — «». При перемаркировке webSQL незаметно применяет новую схему к старой базе данных. Что в моем случае означает добавление новых полей.

Учебник, на который я ссылался, действительно потрясающий (как и функциональность).

person Wytze    schedule 06.06.2012

Я добавляю еще один ответ, потому что я узнал больше об открытой базе данных localDb и ее переносе.

Напомню, что openDatabase принимает следующие параметры: имя - (строка) имя версии базы данных метка - (строка) версия, которую вы хотите открыть отображаемая метка - (строка) довольно бесполезное отображаемое имя, которое, кажется, нигде не используется максимальный размер - (int) наибольший безопасный размер 5 * 1024 * 1024 вновь созданных -= (функция) для запуска, если БД ранее не существовала

Разумнее всего назначить вывод openDatabase переменной. т.е.

myapp.db = openDatabase('mydb','','Моя база данных',5*1024*1024,newlyCreatedCallback);

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

Причина этого в том, что если база данных была создана впервые, вы точно знаете, что вам не нужно будет выполнять какие-либо миграции. Вы можете сразу перейти к функции, которая добавляет таблицы и поля. Я рекомендую использовать persistenceJS — инструмент, помогающий читать локальную базу данных и управлять ею.

Перед вызовом openDatabase целесообразно использовать jQuery для создания пользовательского события 'dbopen', обработчик которого будет выполнять миграции. Этот обработчик может быть вызван двумя событиями. Первый — это «ново созданный» обратный вызов, который мы только что обсуждали. Второй — это setInterval, который вы определяете после вызова openDatabase. Интервал должен проверять наличие переменной myapp.db, которой вы назначили выходные данные openDatabase.

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

Я использую для этого window.setInterval. Убедитесь, что вы создали пользовательское событие 'dbopen' с помощью функции jquery .one(), которая сработает не более одного раза. В противном случае, если база данных была недавно создана, вы запустите событие открытия один раз, когда сработает «ново созданный» обратный вызов, и один раз, когда появится переменная myapp.db.

person Wytze    schedule 03.07.2012
comment
Можете ли вы привести пример этого обратного вызова. Можем ли мы также проверить существование базы данных с помощью этой функции? @Wytze - person Learner; 02.04.2014