qtquick localstorage数据库版本不匹配(缺少INI文件中的“版本”属性)

StackOverflow https://stackoverflow.com//questions/23021373

  •  21-12-2019
  •  | 
  •  

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top