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

Posted

技术标签:

【中文标题】QtQuick LocalStorage 数据库版本不匹配(ini 文件中缺少“版本”属性)【英文标题】:QtQuick LocalStorage database version mismatch (missing "Version" attribute in ini file) 【发布时间】:2014-04-11 19:48:25 【问题描述】:

我在 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 错误?

【问题讨论】:

【参考方案1】:

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

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();

所以,也许你真的需要在创建表之后设置数据库版本......在你对回调执行此操作之前,它只是一个空数据库,不应该真的有版本。

【讨论】:

这似乎是合理的,但从我找到的文档中看一点也不明显。谢谢!【参考方案2】:

在上面的代码中设置这样的属性

 // 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' 是应用描述 '10000' 是数据库的大小

【讨论】:

以上是关于QtQuick LocalStorage 数据库版本不匹配(ini 文件中缺少“版本”属性)的主要内容,如果未能解决你的问题,请参考以下文章

使用QML LocalStorage来存储我们的数据

QT5:未找到 QTQuick.Controls 2.12 版

localStorage sessionStorage 增强版

C++Widgets编程(《Qt Creator快速入门》 第3版 学习笔记 )

基于localStorage的Web版记事本

Backbone的localStorage.js源码详细分析