最近几天在做一个离线端站点时遇到的一个问题,我在数据库中增加了几个表,数据库用的是sqllite以文件形式存储,增加完表之后打包生成了应用程序后发现读取表报错,db文件中并没有更新的几张表,查了下,发现在我增加表之后db文件并没有改变,而是增加了db-wal和db-shm这两个文件,db的更新日期没有变化,但是这两个文件的更新日期正好是我更新数据库的时间,网上百度了一下:
db-wal:从3.7.0版本开始,SQLite支持一种新的事务控制机制,称为“写前日志”或“WAL”。当数据库处于WAL模式时,到该数据库的所有连接都必须使用WAL。特定的数据库将使用回滚日志或WAL,但不能同时使用两者。WAL始终位于与数据库文件相同的目录中,并且具有与数据库文件相同的名称,但是附加了字符串“-wal”。
db-shm:从概念上讲,wal-index是共享内存,尽管当前的VFS实现为wal-index使用一个映射文件。映射文件位于与数据库相同的目录中,并具有与数据库相同的名称,后面附加了“-shm”后缀。因为WAL索引是共享内存,所以当客户机位于不同的机器上时,SQLite不支持网络文件系统上的journal_mode=WAL。数据库的所有用户必须能够共享相同的内存。
那么问题就在于这个WAL日志模式了,运行PRAGMA journal_mode可以获取,给PRAGMA journal_mode赋值可以更新日志模式。将PRAGMA journal_mode=delete,shm、wal文件消失,db文件更新,问题解决。