cap*_*ica 5 qt qml qt5 qtquick2
我在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);
}
);
Run Code Online (Sandbox Code Playgroud)
如果数据库不存在并且已创建,则会执行回调函数,在这种情况下,我会创建数据库模式并填充初始数据集.
下次应用程序启动时,显然我想保持数据库原样,而不是重新创建它.
问题是当我重新启动应用程序时出现此错误:
Error: SQL: database version mismatch
Run Code Online (Sandbox Code Playgroud)
如果我检查在第一次运行应用程序时创建数据库时创建的.ini文件,我会看到:
[General]
Description=Test Database
Driver=QSQLITE
EstimatedSize=1000000
Name=TestDB
Version=
Run Code Online (Sandbox Code Playgroud)
您可以清楚地看到这里的问题是"版本"属性为空.
当应用程序启动时,它会将请求的版本"1.0"与此空字符串""进行比较并失败.
我可以通过将版本指定为""或通过修复ini文件来伪造它以使其工作 - 至少告诉我代码是正确的 - 但显然这不是解决方案.
那么,我错过了什么或者这是一个Qt错误吗?
您可以在创建数据库后设置数据库版本:
var db = LocalStorage.openDatabaseSync(
"TestDB",
"1.0",
"Test Database",
1000000,
function(db) {
createSchema(db);
populateData(db);
db.changeVersion("", "1.0");
}
);
Run Code Online (Sandbox Code Playgroud)
由于回调函数才会被调用它的数据库中不存在,如果当前版本是""(否则,抛出异常),我相信它是安全的,使用它的changeVersion功能才起作用.
编辑:也许这是预期的行为......来自LocalStorage源代码,第700行:
if (dbcreationCallback)
version = QString();
Run Code Online (Sandbox Code Playgroud)
所以,也许你真的需要在创建表之后设置db版本...在回调之前做这个,它只是一个空数据库,并且不应该有一个版本.