QTQuick LocalStorage База данных версии несоответствия (отсутствующая «версия» атрибут в файле INI)
Вопрос
Я использую qtquick / qml / qt5.2.1 на Android. Я также проверил эту проблему на рабочем столе, а не на Android, и я вижу ту же проблему.
Я использую LocalStorage
, чтобы сохранить данные приложения после закрытия приложения.
Я открываю базу данных с использованием openDatabaseSync
:
var db = LocalStorage.openDatabaseSync(
"TestDB",
"1.0", <-- version
"Test Database",
1000000,
function(db) {
createSchema(db);
populateData(db);
}
);
.
Если база данных не существует и была создана, функция обратного вызова выполняется и в этом случае я создаю схему базы данных и заполнить начальный набор данных.
В следующий раз приложение начинается, очевидно, я хочу сохранить базу данных как есть и не воссоздать ее.
Проблема в том, что я перезапуску приложения, я получаю эту ошибку:
Error: SQL: database version mismatch
.
Если я проверю файл .ini, который был создан, когда база данных была создана в первый раз, когда приложение было запущено, я вижу это:
[General]
Description=Test Database
Driver=QSQLITE
EstimatedSize=1000000
Name=TestDB
Version=
.
Вы можете четко видеть проблему вот в том, что атрибут «версия» пуст.
Когда приложение запускается, он сравнивает запрошенную версию «1.0» против этой пустой строки «» и не удается.
Я могу подделать его, чтобы заставить его работать, конечно, указывая версию как «», или путем исправления INI-файла - что, по крайней мере, сообщает мне код в противном случае - но ясно, что это не решение.
Так, я что-то пропустил или это Qt Bug?
Решение
Вы можете установить версию базы данных после ее создания:
var db = LocalStorage.openDatabaseSync(
"TestDB",
"1.0",
"Test Database",
1000000,
function(db) {
createSchema(db);
populateData(db);
db.changeVersion("", "1.0");
}
);
.
Поскольку функция обратного вызова будет названа только в том, что база данных не существует, и функция ChangeVersion будет работать только в том случае, если текущая версия «» (в противном случае, исключение, связанная с исключением), я считаю, что это безопасно использовать.
.Редактировать: Может быть, это предполагаемое поведение ... из
Другие советы
Установите такие атрибуты в соответствии с указанным выше кодом
// db = LocalStorage.openDatabaseSync(identifier, version, description, estimated_size, callback(db))
LocalStorage.openDatabaseSync("kMusicplay", "0.1", "kMusicPlay app Ubuntu", 10000);
.
где 'kmusicplay' это appname, '0.1' это версия, 'kmusicplay app ubuntu' - это описание приложения и «10000» размер базы данных