关于Qt资源文件导致sqlite3文件变只读的问题

加盾男爵 2017-12-11 10:10:09
一个程序使用SQlite3数据库,其中有个功能是数据的恢复出厂设置,程序的目录下有个文件夹./dataFile,数据库文件就放在这个文件夹下,
然后在资源文件里有
<file>data/sourceData.db</file>

这个sourceData.db文件是初始数据,然后程序里如果用户选择了恢复出厂设置,就会执行类似下面的代码

QString oldFile = tr("E:/TFH/dataFile/sourceData.db");
QString newFile = tr(":/data/sourceData.db");
QFile fs;
fs.copy(oldFile,newFile); //直接赋值替换掉用户使用的数据库文件


然后问题来了,当用户再次修改数据库文件,数据库直接回复
"attempt to write a readonly database"

这数据库文件里的数据库变只读文件了,然后我试了下,把资源文件里的直接赋值过去,既关闭程序,然后直接把E:/TFH/sourceData.db这个文件赋值替换掉E:/TFH/dataFile/sourceData.db,程序再次运行一切正常,我想问下为什么这个数据库文件放入资源文件后复制下,里面的数据库就变成只读的了?
...全文
424 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Liuzwang 2017-12-11
  • 打赏
  • 举报
回复
楼主,我想了一下,复制文件应该是:copy一个file,然后粘贴到另一个目录下面。 你的代码的话,copy一个file,到另一个file上。 所以的话,QString newFile = tr(":/data/sourceData.db");改成QString newFile = tr(":/data/"); 试试吧,我感觉应该是这样。
加盾男爵 2017-12-11
  • 打赏
  • 举报
回复
引用 1 楼 Liuzwang 的回复:
你调用的好像是static静态函数啊, 正确姿势应该是QFile::copy(oldFile,newFile);但是这个能不能解决错误就不晓得了。
我下午又试了下,和copy()函数无关,问题出在资源文件上,如果数据库文件不嵌入资源文件而知放在硬盘上的某个位置,那复制过来的权限是没有问题的,但如果数据库文件嵌入资源文件,从资源文件上复制过来,那数据库文件里的数据库就变成只读了
Liuzwang 2017-12-11
  • 打赏
  • 举报
回复
你调用的好像是static静态函数啊, 正确姿势应该是QFile::copy(oldFile,newFile);但是这个能不能解决错误就不晓得了。
sqlfs - 带有 SQL 后端的 Qt 文件系统引擎 Sqlfs 是一个类似于 Qt 源系统但不是只读Qt 文件系统引擎。 它的开发目的是为 Qt 应用程序提供透明的文件存储。 到目前为止,引擎仅限于 SQLite。 可以轻松实现对其他 DBMS 的支持(只需稍微调整 SQL)。 主要用例是让应用程序能够在自己的基于 SQLite 的应用程序文件中托管自己的文件系统。 特征 Qt 文件系统类透明 可以托管 QML 代码 只使用数据库中的一张表 轻量级和简单的代码 平台无关 麻省理工学院执照 用法 类似于 Qt源系统 sqlfs 使用类似前缀的 URL 将文件系统访问路由到 sqlfs: sql:/// // Open a database with an explicit connection name QSqlD

16,211

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧