Sqlite数据库中的.db-shm和.db-wal扩展是什么?

时间:2011-10-15 15:25:03

标签: android sqlite file-extension

在运行一些关闭数据库的测试,删除它并用测试夹具替换之后,我看到了我的应用程序和数据库文件状态的一些奇怪行为。当我在调试PC上使用工具检查数据库文件时,它与应用程序本身似乎报告的内容不匹配。这种奇怪的行为可能与this bug有关。

我注意到有两个文件的基本名称与数据库相同(扩展名为.db。)文件扩展名为.db-shm.db-wal,每个文件都是较新的而不是.db文件的时间戳。

我认为这些是某种类型的临时文件。但是,我想知道应用程序是否被终止,是否应该删除它们?更重要的是,我假设在应用程序被操作系统终止之前,在.db文件中更新存储在其中的任何数据。这是对的吗?

3 个答案:

答案 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扩展数据库。