我在:/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.sql中的行将转储导入到数据库中。但是这种方法很慢。

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

还有其他简便的方法吗?

P.S.我已经阅读了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());

10-07 12:46
查看更多