在运行一些关闭数据库的测试,删除它并用测试夹具替换之后,我看到了我的应用程序和数据库文件状态的一些奇怪行为。当我在调试PC上使用工具检查数据库文件时,它与应用程序本身似乎报告的内容不匹配。这种奇怪的行为可能与this bug有关。
我注意到有两个文件的基本名称与数据库相同(扩展名为.db
。)文件扩展名为.db-shm
和.db-wal
,每个文件都是较新的而不是.db
文件的时间戳。
我认为这些是某种类型的临时文件。但是,我想知道应用程序是否被终止,是否应该删除它们?更重要的是,我假设在应用程序被操作系统终止之前,在.db
文件中更新存储在其中的任何数据。这是对的吗?
答案 0 :(得分:26)
你是对的,这些是SQLite创建的临时文件。如果您手动删除主数据库,您应该删除它们。从我可以收集的内容来看,WAL是对回滚日志的替代,它使SQLite能够在事务失败时回滚更改。 SQLite如何使用它们以及为什么它们被保存了这么长时间取决于SQLite的作者,但一般来说SQLite看起来非常坚固,所以我不会太担心它们。有关详细信息,请查看此处:
http://www.sqlite.org/fileformat2.html#walindexformat
这些文件是SQLite 3.7的新功能。我不确定它们的存在是否与你指出的错误相关,但错误报告建议无论如何都要解决。
答案 1 :(得分:4)
我还没有足够的声誉,只能在satur9nine的答案中添加评论,所以我将在这里继续讨论。
根据the SQLite docs,DB-SHM文件是共享内存文件,仅当SQLite以WAL(预写日志)模式运行时才存在。这是因为在WAL模式下,共享同一个db文件的数据库连接必须全部更新同一存储位置(用作WAL文件的索引),以防止发生冲突。
对于WAL文件,如上所述,它是写日志/日志,对于提交/回滚目的很有用。如果数据库未运行,则删除该文件是完全可以的,实际上,如果存在该文件,它将在重新启动数据库时自动删除(因为它仅在数据库正在主动写入/提交数据时才有用)。
答案 2 :(得分:3)
确保已将光标正确关闭到SELECT
操作中。有时由于未关闭Cursor,SQLiteOpenHelper会创建.db-shm
和.db-wal
扩展数据库。