TL; DR
Ваш код работает нормально.Не путайтесь с временными файлами, которые SQLite создает для работы.
- Файлы WAL и SHM являются временными внутренними файлами, о которых вам не следует беспокоиться.
- Если вы проверяетеесли данные присутствуют при непосредственном рассмотрении файла
db
, данные могут еще не быть там.Подождите, пока вы закроете соединение. - Используйте SQLiteBrowser, чтобы увидеть, есть ли данные или нет.Вы можете проверить SQLiteBrowser или База данных отладки Android
- Вместо использования SQLiteBrowser, вы можете просто проверить, присутствуют ли данные из вашего приложения Android, с помощью запроса SELECT.
WAL и SHM файлы
Как вы заметили, в вашем каталоге db вы можете найти три сгенерированных файла:
your-database-name
your-database-name-shm
your-database-name-wal
Тем не менее, единственное важное значение для вас, где на самом деле находятся данные, это your-database-name
.
Файл wal
используется вместо Rollback Journal .
Начиная с версии 3.7.0 (2010-07-21), SQLite поддерживает новый механизм управления транзакциями, который называется «журнал записи» или «WAL».Когда база данных находится в режиме WAL, все соединения с этой базой данных должны использовать WAL.Конкретная база данных будет использовать либо журнал отката, либо WAL, но не оба одновременно.WAL всегда находится в том же каталоге, что и файл базы данных, и имеет то же имя, что и файл базы данных, но с добавленной строкой «-wal».
То, что вы упоминаете о невозможности увидетьданные в файле вашей базы данных, пока файл wal
все еще там, и затем вы закрываете соединение, и файл wal
исчезает, и данные, наконец, сохраняются в базе данных, - правильное поведение при использованииwal
механизм.
WAL исчезает
Файл WAL существует до тех пор, пока любое соединение с базой данных имеет открытую базу данных.Обычно файл WAL удаляется автоматически при закрытии последнего подключения к базе данных. (Подробнее здесь)
Транзакция не записывается немедленно в файл базы данных
Традиционный журнал отката работает путем записископировать исходное неизмененное содержимое базы данных в отдельный файл журнала отката, а затем записать изменения непосредственно в файл базы данных.В случае сбоя или ROLLBACK исходное содержимое, содержащееся в журнале отката, воспроизводится в файле базы данных, чтобы вернуть файл базы данных в исходное состояние.COMMIT происходит при удалении журнала отката.
Подход WAL инвертирует это.Исходный контент сохраняется в файле базы данных, а изменения добавляются в отдельный файл WAL.COMMIT происходит, когда к WAL добавляется специальная запись, указывающая на фиксацию. Таким образом, COMMIT может происходить без записи в исходную базу данных, что позволяет читателям продолжать работу с исходной неизмененной базы данных, пока изменения одновременно вносятся в WAL .Несколько транзакций могут быть добавлены в конец одного файла WAL.
Конечно, в конечном итоге требуется перенести все транзакции, добавленные в файл WAL, обратно в исходную базу данных. Перемещение транзакций файла WAL обратно в базу данных называется «контрольной точкой».
По умолчанию SQLite автоматически выполняет контрольную точку, когда файл WAL достигает порогового размера 1000 страниц..(Параметр времени компиляции SQLITE_DEFAULT_WAL_AUTOCHECKPOINT можно использовать для указания другого значения по умолчанию.) Приложениям, использующим WAL, не нужно ничего делать, чтобы эти контрольные точки выполнялись .Но если они хотят, приложения могут настроить автоматический порог контрольной точки.Или они могут отключить автоматические контрольные точки и запускать контрольные точки во времямоменты простоя или в отдельном потоке, или в процессе. (Подробнее здесь)
SHM - это просто временный файл общей памяти, связанный с механизмом WAL, единственное назначение которого:
Файл общей памяти не содержит постоянного содержимого.Единственная цель файла с разделяемой памятью - предоставить блок разделяемой памяти для использования несколькими процессами, обращающимися к одной и той же базе данных в режиме WAL. (Подробнее здесь)