gpt4 book ai didi

qt - 是否有任何 Qt SQLite 插件可以通过 VFS 将数据库存储在 RAM 中(用于从 Qt 资源文件加载数据库)?

转载 作者:IT王子 更新时间:2023-10-29 06:26:45 25 4
gpt4 key购买 nike

我在 .qrc 中有一些 :/test.sqlite3 数据库。目标是在程序中直接使用这个数据库。数据库仅用于读取。

QSqlDatabase::setDatabase(":/test.sqlite3") 不起作用,因为 Qt SQLite 不是为与 Qt 的文件系统一起工作而设计的。

解决方案之一是将数据库从 .qrc 复制到 D:\temdb.sqlite3 并通过 QSqlDatabase::setDatabase("D:\\temdb.sqlite3")。但是程序不能与 OS 文件系统一起工作。

第二种方案是将:/dump.sql存储在资源中,然后通过QSqlDatabase::setDatabase(":memory:")创建内存数据库并导入dump通过读取和执行来自 :/dump.sql 的行进入它。但是这种方法很慢。

最后,困难但真实的方法是使用 VFS 实现为 SQLite 创建自己的 Qt 插件,用于从 RAM 读取数据库,其中我们有 ":/test.sqlite3".

还有其他简单的方法吗?

附言我已经阅读了所有问题,例如 Converting in-memory sqlite database to blob/char array和其他,所以不要将其标记为重复。我的问题是关于任何其他方法。

最佳答案

您可以利用 Qt QTemporaryFile复制您的数据并开始。 QTemporaryfile 适用于所有操作系统。

这是一个例子(这个临时文件与整个 qApp 关联,因此一旦您退出应用程序,它就会被删除):

QTemporaryFile tmpFile(qApp);
tmpFile.setFileTemplate("XXXXXX.sqlite3");
if (tmpFile.open()) {
QString tmp_filename=tmpFile.fileName();
qDebug() << "temporary" << tmp_filename;

QFile file(":/test.sqlite3");
if (file.open(QIODevice::ReadOnly)) {
tmpFile.write(file.readAll());
}

tmpFile.close();
}

您可以将文件 tmpFile.fileName() 重新打开为 QSqlDatabase:

QSqlDatabase::setDatabase(tmpFile.fileName());

关于qt - 是否有任何 Qt SQLite 插件可以通过 VFS 将数据库存储在 RAM 中(用于从 Qt 资源文件加载数据库)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40127409/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com