QtQuick LocalStorage数据库版本不匹配(缺少ini文件中的"Version"属性)

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错误吗?

Gab*_*elF 5

您可以在创建数据库后设置数据库版本:

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版本...在回调之前做这个,它只是一个空数据库,并且不应该有一个版本.