系统: 嵌入式linux
软件:QT、qsql、sqlite
在项目中实现一个导入数据库功能。
该功能的实现原理是:将U盘烤入本地,让后复位板子,在板子重启时拷贝本地覆盖原数据库。
该功能有时或出现导入的数据库内容丢失问题。
比如原数据库大小位900k,导入数据库大小为2M,拷贝结束后原数据库大小变为2M,这样是正常的。但有时候会出现元数据库大小为900k,且内容时2m数据库的内容。
经过多番调试发现,数据库在异常关闭时,会产生一个恢复文件(以-journal 结尾),当程序运行使用数据库时,覆盖的数据库被还原为拷贝之前大小。
以下是转载
转自:http://blog.csdn.net/kaiwii/article/details/8609093
今天在Android中将sqlite的数据库文件生成在SD卡上的过程中,发现生成的.db文件的旁边
生成了一个大小为0的与数据库文件同名的.db-journal文件,不明白此文件的用途,于是
google了sqlite的官方文档,发现该文件的用途如下:
该文件是sqlite的一个临时的日志文件,主要用于sqlite事务回滚机制,在事务开始时产生,
在事务结束时删除;当程序发生崩溃或者系统断电时该文件将留在磁盘上,以便下次程序运行
时进行事务回滚。
但是我创建数据库时将事务结束了,同时程序也没有崩溃,为什么还是会在磁盘上产生
.db-journal文件呢?
深入研究,发现这是sqlite生成日志文件的不同模式造成的,在android采用的这种模式下,
.db-journal文件是永久的留在磁盘上不会被自动清除的,如果没有发生事务回滚那么.db-journal
文件的大小为0,这样就避免了每次生成和删除.db-journal文件的开销。
到此,所有的疑惑解开了。
解决办法:
对数据库进行拷贝覆盖时,先删除恢复文件在使用。