1. ホーム
  2. android

[解決済み] Sqliteデータベースの拡張子.db-shmと.db-walとは何ですか?

2022-02-11 08:19:30

質問内容

データベースを閉じ、削除し、テストフィクスチャに置き換えるテストをいくつか実行した後、私のアプリケーションとそのデータベースファイルの状態について、いくつかの奇妙な動作を見ています。 デバッグ用PCのツールでデータベースファイルを調べると、アプリケーション自身が報告しているようなものと一致しません。 この奇妙な動作は、もしかしたら、以下のことに関連しているのかもしれません。 このバグ .

データベースと同じベースネームのファイルが2つあることに気づきました(通常の .db という拡張子をつけています(笑)。 ファイルの拡張子は .db-shm.db-wal よりも新しく、それぞれ .db ファイルのタイムスタンプを表示します。

これらはある種の一時的なファイルであると推測されます。 しかし、アプリケーションを終了した場合、これらは削除されるはずではありませんか? さらに重要なのは、それらに保存されているデータはすべて .db ファイルが作成され、OSによってアプリケーションが終了されます。 これは正しいのでしょうか?

解決方法は?

これらはSQLiteによって作成された一時的なファイルです。もしメインのDBを手動で削除しているのであれば、これらも削除した方がいいでしょう。私が調べたところでは、WALはロールバックジャーナルの代わりで、トランザクションが失敗したときにSQLiteが変更をロールバックできるようにするものです。SQLiteがそれをどのように使うのか、なぜそんなに長く残しておくのかはSQLiteの作者次第ですが、一般的にSQLiteはかなり強固なようなので、私はあまり気にしないことにしています。より詳しい情報はこちらをご覧ください。

http://www.sqlite.org/fileformat2.html#walindexformat

これらのファイルは SQLite 3.7 の新機能です。このファイルの存在がご指摘のバグに関係するかどうかは分かりませんが、バグレポートには回避方法が書かれています。

UPDATEしてください。

WALに関するより良いドキュメントはこちらです。

https://www.sqlite.org/wal.html

WALの内容は定期的にDBファイルに移動されますが、プロセス終了のたびに移動されることは保証されません。したがって、WALが有効な場合、各SQLite DBは.dbファイルと.db-walファイルの両方、保存されなければならないディスク上の2つのファイルから構成されています。

.db-shmファイルは、一時的なデータのみを格納する共有メモリファイルです。