我在:/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());