在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