2011-02-11 56 views
12

在Google的記事本示例中,它們似乎並沒有關閉數據庫,至少在onDestroy()中沒有關閉。關閉數據庫至關重要嗎?

關閉它的目的是什麼,我真的需要嗎?開放式數據庫佔用大量內存嗎?我發現,如果有任何線程在運行完畢後可能會嘗試訪問它,則在onDestroy中關閉它會留下漏洞。

+0

我的答案是否被接受,然後不被接受? – Farray 2011-02-15 16:25:33

+0

我試圖在手機上接受它...我猜這個網站在Android瀏覽器上有點bug。 – Tenfour04 2011-02-16 02:53:14

回答

10

如果不關閉數據庫連接,它們會隨着時間的推移導致內存泄漏。

記事本示例確實使用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(); 
} 

然後關閉在你AsyncTaskonPostExecute方法的連接。

希望有幫助...

0

您應該關閉它。

記事本示例應該使用ActivitystartManagingCursor

+4

這需要照顧遊標,但是SQLiteDatabase對象呢? – Tenfour04 2011-02-11 23:13:59