2014-10-06 44 views
17

在我的類應用程序的數據庫目錄(/data/data/com.me.myApp/databases)中,對於我創建的每個sqlite數據庫,都有一個相同名稱的相應數據庫,並在其名稱後附加「-journal」。Android中的「-journal」SQLite數據庫是什麼?

e.g:MYDATABASE,MYDATABASE期刊,myOtherDatabase.db,myOtherDatabase.db期刊

這是什麼?

,並

如果我提供預填充數據庫爲我的應用程序(按:http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/),我需要包括這些以及「?

回答

16

這樣的-journal文件不需要(並且應該而不是)被分發。

這是因爲SQLite使用的各種日誌文件代表臨時數據(ref。SQLite's Use Of Temporary Disk Files)。特別是-journal文件是回滾日誌

回滾日誌是一個臨時文件,用於在SQLite中實現原子提交和回滾功能。 (關於如何工作的詳細討論,請參閱單獨的文檔,標題爲SQLite中的Atomic Commit。)回滾日誌始終與數據庫文件位於同一目錄中,並且與數據庫文件具有相同的名稱,除了8個字符「 -journal「附加。

回滾日誌通常在事務第一次啓動時創建,通常在事務提交或回滾時刪除。回滾日誌文件對於實現SQLite的原子提交和回滾功能是必不可少的。如果沒有回滾日誌,SQLite將無法回滾未完成的事務,並且如果在事務中間發生崩潰或斷電,整個數據庫可能會在沒有回滾日誌的情況下損壞。

一般來說,這些-journal文件應該只存在有打開的SQLite數據庫 - 或者更確切地說,一個運行的事務 - 但可以通過PRAGMA journal_mode控制。使用默認的編譯指示設置,-journal文件將被刪除。

DELETE日誌記錄模式是正常行爲。在DELETE模式下,回滾日誌在每個事務結束時被刪除。事實上,刪除操作是導致事務提交的操作。

只作一定要複製實際的數據庫文件時,數據庫打開,所有期刊已被SQLite的自身刪除(或清除);這意味着所有事務都已完成,並且數據庫處於一致狀態。

+0

如果-journal文件一直存在且非平凡大小(例如30kB),但是應用程序沒有對數據庫執行任何活動並且不會使數據庫保持打開狀態,該怎麼辦? – Michael 2015-12-02 06:29:17

+1

@Michael這是一個很好的問題 - 但我擔心它會被埋在評論中,因爲我沒有直接的專家知識答案。考慮創建另一個SO問題,鏈接到這個(和其他)問題/答案以提供一個良好的基礎。 – user2864740 2015-12-02 22:26:34

+1

@Michael對不起,我恐怕我到這裏可能來不及了,但我有一些有趣的信息[在這裏](http://sandersonforensics.com/forum/content.php?208-Dealing-with -records發現的功能於SQLite的回滾期刊)。它表示,當一個事務被提交時,頭部通常被歸零。在每次提交時,都會寫入標題,然後寫入頁面,覆蓋原始內容,然後只有標題在成功時歸零。如果另一個提交不執行此操作,則可以在數據庫中執行VACUUM,以「乾淨」(例如移除)文件的一般解決方案。 – Lutarisco 2017-02-26 15:00:04

相關問題