2011-02-11 23 views
12

En el ejemplo del Bloc de notas de Google, parece que no cierran la base de datos, al menos no en onDestroy().¿Es esencial cerrar la base de datos?

¿Cuál es el propósito de cerrarlo, y realmente lo necesito? ¿Una base de datos abierta ocupa una cantidad significativa de memoria? Descubrí que cerrarlo en Destroy deja vulnerabilidades si hay algún subproceso en ejecución que pueda intentar acceder a él una vez que la Actividad haya finalizado.

+0

¿mi respuesta se acepta y no se acepta? – Farray

+0

Estaba intentando aceptarlo en mi teléfono ... Supongo que este sitio tiene errores en el navegador de Android. – Tenfour04

Respuesta

10

Si no cierra las conexiones de la base de datos, causarán pérdidas de memoria con el tiempo.

El ejemplo del Bloc de notas utiliza startManagingCursor, pero aún necesita cerrar explícitamente la conexión db. Ejecute el ejemplo del Bloc de notas tal como está y edite varias notas en sucesión; verá que comienza a lanzar Advertencias y errores en LogCat. (En las aplicaciones más grandes, también comenzará a ver las advertencias de memoria detección de fugas.)

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) 

Usted ha mencionado que el cierre en onDestroy() "deja vulnerabilidades" en ningún hilos no interfaz de usuario que todavía se están ejecutando. Si está utilizando AsyncTask, puede verificar el estado de estos hilos usando getStatus en sus tareas.

if (myAsyncTask.getStatus() == AsyncTask.Status.FINISHED){ 
    mDbHelper.close(); 
} 

continuación, cierre la conexión en el método de su AsyncTaskonPostExecute.

Espero que ayude ...

+1

Wow ... ¡Nunca pensé que los ejemplos de Google usarían un código inoptimal! – John

+0

¿Se puede cerrar la base de datos antes del cursor de forma segura? Gracias. – Tenfour04

+0

@ TenFour04 - No. Permitirá un ajuste si cierra la base de datos y luego intenta acceder al cursor. Si no está en el hilo de la interfaz de usuario, no creo que bloquee la aplicación, pero sigue siendo de mala calidad. – Farray

0

Debería cerrarlo.

El ejemplo del bloc de notas debe estar usando Activity 's startManagingCursor.

+4

Eso cuida el cursor, pero ¿qué pasa con el objeto SQLiteDatabase? – Tenfour04

Cuestiones relacionadas