关闭数据库是否必不可少?

时间:2011-02-11 17:31:34

标签: android sqlite

在Google的记事本示例中,它们似乎并未关闭数据库,至少不在onDestroy()中。

关闭它的目的是什么,我真的需要吗?开放数据库是否会占用大量内存?我发现在onDestroy中关闭它会留下漏洞,如果有任何线程运行,可能会在Activity完成后尝试访问它。

2 个答案:

答案 0 :(得分:10)

如果不关闭数据库连接,它们将导致内存泄漏。

Notepad示例使用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();
}

然后使用onPostExecute的{​​{1}}方法关闭连接。

希望有帮助...

答案 1 :(得分:0)

你应该关闭它。

记事本示例应使用Activity的{​​{3}}。