#android #sqlite #file-extension
#Android #sqlite #расширение файла
Вопрос:
Я наблюдаю какое-то странное поведение с моим приложением и состоянием его файла базы данных после выполнения некоторых тестов, которые закрывают базу данных, удаляют ее и заменяют тестовым устройством. Когда я просматриваю файл базы данных с помощью инструмента на моем отладочном компьютере, он не соответствует тому, что, по-видимому, сообщает само приложение. Возможно, это странное поведение связано с этой ошибкой.
Я заметил, что есть два файла с тем же базовым именем, что и база данных (с обычным .db
расширением.) Расширениями файлов являются .db-shm
и .db-wal
, и каждое из них новее, чем .db
временная метка файла.
Я предполагаю, что это какой-то тип временных файлов. Однако мне интересно, если приложение завершено, не следует ли их удалить? Что еще более важно, я предполагаю, что все данные, хранящиеся в них, обновляются внутри .db
файла до завершения работы приложения операционной системой. Это правильно?
Комментарии:
1. @satur9nine это действительно странно.. Меня попросили обновить чужой код .. и во время тестирования я понял, что его использование core data отлично работало с iOS 6.x .. но затем, когда я протестировал его на iOS 7.x .. это привело к вышеупомянутому
.db-shm
и.db-wal
.. это случилось с кем-нибудь еще?2. В iOS 7 они, по-видимому, содержат все транзакции. Файл db для меня является пустой базой данных. Мне нужно захватить все три файла, чтобы увидеть «реальное» содержимое БД.
Ответ №1:
Вы правы, это временные файлы, созданные SQLite. Если вы вручную удаляете основную базу данных, вам, вероятно, следует удалить и их. Из того, что я могу собрать, WAL является заменой журнала отката, который позволяет SQLite откатывать изменения при сбое транзакции. Как SQLite использует их и почему они хранятся так долго, зависит от авторов SQLite, но в целом SQLite кажется довольно надежным, поэтому я бы не стал слишком беспокоиться о них. Для получения дополнительной информации посмотрите здесь:
http://www.sqlite.org/fileformat2.html#walindexformat
Эти файлы являются новой функцией SQLite 3.7. Я не уверен, связано ли их существование с ошибкой, на которую вы указали, но в отчете об ошибке в любом случае предлагается обходной путь.
Обновить:
Лучшая документация о WAL здесь:
https://www.sqlite.org/wal.html
Содержимое WAL периодически перемещается в файл DB, но это не гарантируется при каждом завершении процесса. Таким образом, когда WAL включен, каждая база данных SQLite состоит из двух файлов на диске, которые должны быть сохранены, как .db-файл, так и .db-wal-файл.
Файл .db-shm — это файл общей памяти, который содержит только временные данные.
Комментарии:
1. Но как насчет файла .shm. Можете ли вы пролить некоторый свет на это?
2. По ссылке: файл mmapped находится в том же каталоге, что и база данных, и имеет то же имя, что и база данных, с добавлением суффикса «-shm».
3. Я до сих пор не понимаю, что именно они делают, но, похоже, я не могу просмотреть содержимое файла .db без них. Являются ли они какими-либо метаданными?
4. На Android я хотел бы предупредить, что если вы перемещаете свою базу данных в другую папку, вы также должны переместить файлы -wal и -shm . В противном случае ваша база данных может быть пустой. Эта проблема возникла, по крайней мере, на эмуляторе.
Ответ №2:
У меня пока недостаточно репутации, чтобы просто добавить комментарий к ответу satur9nine, поэтому я продолжу здесь.
Согласно документам SQLite, файл DB-SHM представляет собой файл общей памяти, присутствующий только при запуске SQLite в режиме WAL (журнал предварительной записи). Это связано с тем, что в режиме WAL соединения с БД, совместно использующие один и тот же файл БД, должны обновлять одну и ту же ячейку памяти, используемую в качестве индекса для файла WAL, чтобы предотвратить конфликты.
Что касается файла WAL, как указывалось выше, это журнал записи / журнал, полезный для фиксации / отката.
Комментарии:
1. Из документации (раздел 4): «Файл WAL является частью постоянного состояния базы данных и должен храниться в базе данных, если база данных копируется или перемещается». Удаление этого файла вручную может привести к потере данных!
Ответ №3:
Убедитесь, что вы правильно закрыли курсор SELECT
для работы. Иногда SQLiteOpenHelper создает .db-shm
и .db-wal
расширяет базу данных из-за незакрытого курсора.