2014-10-06 3 views
17

В моем каталоге базы данных приложений (/data/data/com.me.myApp/databases) для каждой базы данных sqlite, которую я создаю, есть соответствующая база данных с тем же именем, к которой добавлен «-journal».Что такое база данных SQLite -journal в Android?

например: MyDatabase, MyDatabase-журнал, myOtherDatabase.db, myOtherDatabase.db-журнал

Что это?

и

Если я обеспечиваю предварительно заполненные базы данных для моего приложения (в соответствии с: http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/) мне нужно, чтобы включить их, а?

ответ

16

Такие -journal файлам не нужно (и должно быть не).

Это связано с тем, что различные файлы журналов представляют временные данные (ссылка SQLite's Use Of Temporary Disk Files), используемые SQLite. В частности, файл -journal представляет собой журнал отката .

Журнал отката является временным файлом, используемым для реализации возможностей атомной фиксации и отката в SQLite. (Подробное обсуждение того, как это работает, см. В отдельном документе под названием Atomic Commit In SQLite.) Журнал отката всегда находится в том же каталоге, что и файл базы данных, и имеет то же имя, что и файл базы данных, за исключением 8 символов " -журнал ".

Журнал отката обычно создается при первой попытке транзакции и обычно удаляется при совершении или откате транзакции. Файл журнала отката необходим для реализации возможностей атомной фиксации и отката SQLite. Без журнала отката SQLite не сможет откатить неполную транзакцию, и если в середине транзакции произошел сбой или потеря мощности, вся база данных, скорее всего, будет повреждена без журнала отката.

В целом эти -journal файлы должны существовать только когда есть открытая база данных SQLite - или, вернее, запущенную транзакцию - но можно управлять с помощью PRAGMA journal_mode. С настройками прагмы по умолчанию файлы -journal будут удалены.

Режим ведения журнала DELETE - это нормальное поведение. В режиме DELETE журнал отката удаляется по завершении каждой транзакции. Действительно, операция удаления - это действие, которое заставляет транзакцию совершать транзакции.

Убедитесь, что только копировать фактические файлы базы данных, когда база данных не открыты и все журналы были удалены (или очищаются) самая SQLite; это означает, что все транзакции завершены, и база данных находится в согласованном состоянии.

+0

Что делать, если файл -journal постоянно присутствует и нетривиальный размер (например, 30kB), но одно приложение не выполняет никаких действий с базой данных и не оставляет базы данных открытым? – Michael

+1

@Michael Это хороший вопрос, но я боюсь, что он будет похоронен в комментарии, так как у меня нет непосредственного экспертного ответа. Подумайте о создании другого вопроса SO, связанного с этим (и другими) вопросами/ответами, чтобы создать хорошую основу. – user2864740

+1

@ Майкл. Извините, я боюсь, что приехал, возможно, слишком поздно здесь, но у меня есть интересная информация [здесь] (http://sandersonforensics.com/forum/content.php?208-Dealing-with -Records обретенной-в-SQLite-RollBack-журналов). В нем говорится, что при совершении транзакции заголовок обычно обнуляется. При каждом фиксации заголовок записывается, тогда страницы записываются, переписывая исходное содержимое, тогда только заголовок обнуляется при успешном завершении. Общее решение «очистить» (например, удалить) файл, если другой коммит не делает этого, может состоять в том, чтобы выполнить VACUUM в БД. – Lutarisco