El mejor lugar para cerrar la conexión a la base de datos

Estaba buscando un tiempo para responder a mi pregunta, pero no recibí lo que necesitaba. Tengo una aplicación con un ListView y un formulario donde puedo agregar un nuevo registro a DB. Entonces no hay muchas preguntas para hacer.

¿Cómo manejar las conexiones a db? ¿Debo cerrarlo después de obtener lo que quiero o debería mantenerlo abierto todo el tiempo hasta que se cierre la aplicación? Quiero saber cuál es la mejor manera mientras pienso en el rendimiento y la duración de la batería.

Según esta publicación de un ingeniero de Google (Dianne Hackborn) , no hay nada de malo en dejar la conexión de la base de datos abierta:

Android tomó una decisión de diseño deliberada que puede parecer sorprendente, simplemente renunciar a la idea de que las aplicaciones salgan limpiamente y en su lugar dejar que el kernel limpie sus recursos. Después de todo, el kernel necesita poder hacer esto de todos modos. Dado ese diseño, mantener todo abierto durante toda la duración de un proceso y nunca cerrarlo simplemente no es una filtración. Se limpiará cuando el proceso esté limpio.

Entonces, para simplificar, extendería la clase Application para proporcionar un punto de entrada único y bien definido para su código, y abriría la conexión de la base de datos en su onCreate() . Almacene la conexión de BD como un campo en su Aplicación y proporcione un método de acceso para que la conexión esté disponible para el rest de su código.

Entonces, no te preocupes por cerrarlo.

Establecer la conexión a la base de datos es costoso. Si las conexiones no son escasas, y la base de datos es local, mantendría la conexión abierta en lugar de establecerla para cada operación de escritura en la base de datos, como lo haría normalmente en una aplicación cliente-servidor que necesita escalar a acomodar una gran cantidad de usuarios concurrentes.

En general, cerraría la conexión en la función onDestroy () de la Actividad que abrió la conexión. Cerraría () un cursor de una base de datos en la función que utiliza el cursor.

 public MyActivity extends Activity{ private myDatabase mDatabase; // myDatabase extends SQLiteOpenHelper private Cursor mCursor; public MyActivity(Context context){ super(context); initMemberVariables(); } public ElementButton(Context context, AttributeSet attrS){ super(context, attrS); initMemberVariables(); } public ElementButton(Context context, AttributeSet attrS, int defStyle){ super(context, attrS, defStyle); initMemberVariables(); } private void initMemberVariables(){ mDatabase = new PSEdb(this.getContext()); } private void getData(){ mCursor = mDatabase.MyGetterFunction(); while(mCursor.moveToNext()){ try{ // populate your data }catch(CursorIndexOutOfBoundsException ex){ // handle the exception } } mCursor.close(); } @Override public void onDestroy(){ super.onDestroy(); mDatabase.close(); } }