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

时间:2014-04-11 19:48:26

标签: 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);
    }
);

如果数据库不存在并且已创建,则会执行回调函数,在这种情况下,我会创建数据库模式并填充初始数据集。

下次应用程序启动时,显然我想保持数据库的原样,而不是重新创建它。

问题是当我重新启动应用程序时出现此错误:

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

2 个答案:

答案 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'是数据库的大小