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

Rin*_*nat 6 sqlite qt vfs qt5

:/test.sqlite3里面有一些数据库.qrc.目标是在程序中直接使用此数据库.数据库仅用于阅读.

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.但这种方法很慢.

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

还有其他简单方法吗?

PS我已经阅读了所有问题,如将内存中的sqlite数据库转换为blob/char数组等,所以不要将其标记为重复.我的问题是关于任何其他方法.

bib*_*ibi 4

您可以利用 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();
}
Run Code Online (Sandbox Code Playgroud)

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

QSqlDatabase::setDatabase(tmpFile.fileName());
Run Code Online (Sandbox Code Playgroud)