2011-12-16 74 views
12

在我的android應用程序中,我使用SQLiteOpenHelper來實現ContentProvider。 查詢,添加,刪除操作都是通過ContentProvider。什麼時候應該在ContentProvider使用的SQLiteOpenHelper上調用close()

但在我的一個android手機(htc g13)中,我在目錄/ data/data/[軟件包名稱] /數據庫中找到* .db-wal文件。與ContentProvider一起操作時,文件大小增長非常快。它佔用了用戶RAM空間太多。

建議關閉SQLiteOpenHelper來解決我的問題(這很有用)在後enter link description here

但我想找到一個「地方」添加「close()」方法,因爲我沒有直接使用SQLiteOpenHelper(通過ContentProvider使用)。 ContentProvider中的query()方法必須返回一個Cursor,並且SQLiteDatabse應該保持打開狀態。

我很困惑,我現在做什麼來保持* .db-wal消失並正常使用ContentProvider?

+2

這是一箇舊的線程,但仍然與谷歌有關,所以這裏是對正確答案的引用:http:// stackoverflow。COM /問題/ 4547461 /閉的數據庫-IN-A-ContentProvider的 – saulobrito 2013-01-04 20:12:46

+0

我覺得這是最好的答案,謝謝。 – cmoaciopm 2013-05-21 08:30:00

回答

5

你有一對夫婦的情況下,以覆蓋:

1)當你的應用程序結束(如進入的onDestroy()),請確保您關閉所有遊標,SQLiteDatabase的數據庫實例和SQLiteOpenHelpers(使用模型,如果(連接2)當你的應用程序去onPause() - > onResume() - 適當地使用這個階段暫停/恢復你的連接或關閉/打開它們。

這是一個很好的習慣,在完成使用它之後立即關閉數據庫。該數據庫緩存,所以沒有問題,將其關閉並重新獲得例如當再次需要它getWritableDatabase()/ getReadableDatabase()

從官方文檔: 「一旦成功打開,數據庫緩存,所以你可以在每次需要寫入到數據庫時調用此方法。(請確保調用close()時,你不再需要數據庫。)」

還銘記保持,如果SQLiteOpenHelper緩存和跟蹤所有打開SQLiteDatabase實例,它基本上意味着如果不保留打開的數據庫連接,則不必在SQLiteOpenHelper上調用close。

我建議在停止使用它們後立即關閉所有遊標和數據庫。總是嘗試執行try/catch /查詢操作,最後阻止調用對象的close方法。

6

Android框架工程師認爲您需要關閉數據庫。

按照戴安娜Hackborn(Android框架工程師)in this thread

創建它的宿主進程時創建一個內容提供商,以及 仍然各地,只要過程做,所以沒有必要到 關閉數據庫 - 它將作爲內核的一部分關閉 在進程終止時清理進程的資源。

相關問題