qtquick localstorage数据库版本不匹配(缺少INI文件中的“版本”属性)
题
我在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=
.
可以清楚地看到问题在这里,“版本”属性为空。
当应用程序启动时,它将所请求的版本“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");
}
);
.
由于回调函数只会被称为数据库不存在,并且如果当前版本为“”(否则,抛出异常),则CanceerVersion函数将仅工作,我相信使用它是安全的。
编辑:也许这是预期的行为...从 localstorage源代码,第700行:
if (dbcreationCallback)
version = QString();
.
所以,也许你真的需要在你创建表中设置数据库版......在你在回调之前,它只是一个空的数据库,而且不应该真正有一个版本。
其他提示
在上面的代码中设置这样的属性
// 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'是数据库的大小
不隶属于 StackOverflow