在Google的記事本示例中,它們似乎並沒有關閉數據庫,至少在onDestroy()中沒有關閉。關閉數據庫至關重要嗎?
關閉它的目的是什麼,我真的需要嗎?開放式數據庫佔用大量內存嗎?我發現,如果有任何線程在運行完畢後可能會嘗試訪問它,則在onDestroy中關閉它會留下漏洞。
在Google的記事本示例中,它們似乎並沒有關閉數據庫,至少在onDestroy()中沒有關閉。關閉數據庫至關重要嗎?
關閉它的目的是什麼,我真的需要嗎?開放式數據庫佔用大量內存嗎?我發現,如果有任何線程在運行完畢後可能會嘗試訪問它,則在onDestroy中關閉它會留下漏洞。
如果不關閉數據庫連接,它們會隨着時間的推移導致內存泄漏。
記事本示例確實使用startManagingCursor
,但您仍然需要顯式關閉數據庫連接。按原樣運行記事本示例並連續編輯幾個筆記,您將看到它開始在LogCat中引發警告和錯誤。 (在較大的應用程序,你也將會開始看到檢測內存泄漏的警告。)
W/SQLiteCompiledSql( 302): Releasing statement in a finalizer. Please ensure that you explicitly call close() on your cursor: INSERT INTO notes(body, title) VALUES(?, ?);
W/SQLiteCompiledSql( 302): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
W/SQLiteCompiledSql( 302): at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:62)
...
W/SQLiteCompiledSql( 302): at dalvik.system.NativeStart.main(Native Method)
E/Database( 302): close() was never explicitly called on database '/data/data/com.android.demo.notepad3/databases/data'
E/Database( 302): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
E/Database( 302): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1810)
...
E/Database( 302): at dalvik.system.NativeStart.main(Native Method)
您提到,在onDestroy()
關閉它「留下的漏洞」中仍在運行的任何非UI線程。如果你使用的是AsyncTask,你可以在你的任務上使用getStatus
來檢查這些線程的狀態。
if (myAsyncTask.getStatus() == AsyncTask.Status.FINISHED){
mDbHelper.close();
}
然後關閉在你AsyncTask
的onPostExecute
方法的連接。
希望有幫助...
您應該關閉它。
記事本示例應該使用Activity
的startManagingCursor。
這需要照顧遊標,但是SQLiteDatabase對象呢? – Tenfour04 2011-02-11 23:13:59
我的答案是否被接受,然後不被接受? – Farray 2011-02-15 16:25:33
我試圖在手機上接受它...我猜這個網站在Android瀏覽器上有點bug。 – Tenfour04 2011-02-16 02:53:14