我在Android上使用QtQuick / QML / Qt5.2.1。我也在桌面而不是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=
你可以清楚地看到问题在于&#34;版本&#34;属性为空。
当应用程序启动时,它会比较请求的版本&#34; 1.0&#34;反对这个空字符串&#34;&#34;并失败。
我可以通过将版本指定为&#34;&#34;或修复ini文件来伪装它以使其工作 - 至少告诉我代码是正确的 - 但显然&# 39;不是解决方案。
那么,我错过了什么或者这是一个Qt错误吗?
答案 0 :(得分:5)
您可以在创建数据库后设置数据库版本:
var db = LocalStorage.openDatabaseSync(
"TestDB",
"1.0",
"Test Database",
1000000,
function(db) {
createSchema(db);
populateData(db);
db.changeVersion("", "1.0");
}
);
由于回调函数只会被调用,因此数据库不存在,并且changeVersion函数仅在当前版本为“”时才起作用(否则抛出异常),我相信使用它是安全的。
编辑:也许这是预期的行为......来自LocalStorage source code,第700行:
if (dbcreationCallback)
version = QString();
所以,也许你真的需要在创建表之后设置db版本...在回调之前做这个,它只是一个空数据库,并且不应该有真正的版本。
答案 1 :(得分:0)
在上面的代码
中设置这样的属性 // 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'是app discription '10000'是数据库的大小