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 文件中缺少“版本”属性)的主要内容,如果未能解决你的问题,请参考以下文章
QT5:未找到 QTQuick.Controls 2.12 版
localStorage sessionStorage 增强版