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

Android Sqlite数据库中的.db shm和.db wal扩展是什么?,android,sqlite,file-extension,Android,Sqlite,File Extension,在运行一些关闭数据库、删除数据库并用测试夹具替换数据库的测试之后,我发现我的应用程序及其数据库文件的状态出现了一些奇怪的行为。当我在调试PC上使用工具检查数据库文件时,它与应用程序本身似乎报告的内容不匹配。这种奇怪的行为很可能与你的行为有关 我注意到有两个文件的基本名称与数据库相同(具有正常的.db扩展名)。文件扩展名是.db shm和.db wal,每个文件的时间戳都比.db文件的时间戳新 我假设这些是某种类型的临时文件。然而,我想知道如果申请被终止,他们不应该被删除吗?更重要的是,我假设在操

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

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


我假设这些是某种类型的临时文件。然而,我想知道如果申请被终止,他们不应该被删除吗?更重要的是,我假设在操作系统终止应用程序之前,
.db
文件中存储的任何数据都会更新。正确吗?

正确,这些是SQLite创建的临时文件。如果要手动删除主数据库,可能也应该删除这些数据库。据我所知,WAL是回滚日志的替代品,它使SQLite能够在事务失败时回滚更改。SQLite如何使用它们,以及它们为什么被保留这么长时间,取决于SQLite的作者,但总体而言,SQLite似乎坚如磐石,所以我不会太担心它们。有关更多信息,请查看此处:

这些文件是SQLite 3.7的新功能。我不确定它们的存在是否与您指出的bug有关,但bug报告建议无论如何都要解决

更新:

关于WAL的更好的文档如下:

WAL的内容会定期移动到DB文件中,但不能保证每次进程退出时都会发生这种情况。因此,当启用WAL时,每个SQLite DB由磁盘上必须保留的两个文件组成,即.DB文件和.DB WAL文件


.db shm文件是一个共享内存文件,它只包含临时数据。

我还没有足够的声誉来为Sature9nine的答案添加注释,所以我将在这里继续讨论

根据,DB-SHM文件是一个共享内存文件,只有在SQLite以WAL(写前日志)模式运行时才会出现。这是因为在WAL模式下,共享相同db文件的db连接必须全部更新用作WAL文件索引的相同内存位置,以防止冲突


对于WAL文件,如上所述,它是一个写日志/日志,用于提交/回滚目的。如果数据库未运行,则完全可以删除此文件,事实上,如果数据库存在,则在重新启动数据库时会自动删除此文件(因为它仅在数据库正在积极写入/提交数据时有用)。

请确保已将光标正确关闭到
选择操作中。有时SQLiteOpenHelper会因为光标未关闭而创建
.db shm
.db wal
扩展数据库。

@sature9nine这真是奇怪。。我被要求更新别人的代码。。在测试过程中,我意识到他对核心数据的使用在iOS 6.x上运行良好。。但是当我在iOS 7.x上测试它时。。它产生了上述
.db shm
.db wal
。。这是否发生在其他人身上?在iOS 7上,这些似乎包含所有事务。db文件对我来说是一个空数据库。我需要抓取所有三个文件来查看数据库的“真实”内容。但是.shm文件呢。你能解释一下吗?根据链接:mmapped文件与数据库位于同一目录中,与数据库同名,并附加了“-shm”后缀。我仍然不清楚它们到底做了什么,但似乎没有它们我无法查看.db文件的内容。它们是任何类型的元数据吗?在android上,我想警告您,如果您要将数据库移动到其他文件夹,则还必须移动-wal和-shm文件。否则,您的数据库可能为空。这个问题至少出现在emulator上。来自(第4节):“WAL文件是数据库持久状态的一部分,如果复制或移动数据库,则应与数据库一起保存”。手动删除此文件可能会导致数据丢失!