我:/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数组等,所以不要将其标记为重复.我的问题是关于任何其他方法.
您可以利用 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)
| 归档时间: |
|
| 查看次数: |
516 次 |
| 最近记录: |