2011-07-07 10 views
44

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.El mejor lugar para cerrar la conexión de la base de datos

¿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.

+1

Gran explicación aquí ... http://stackoverflow.com/questions/14002022/android-sq-lite-closed-exception/25379071#25379071 – Nepster

Respuesta

4

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.

+1

Sí, encontré que la apertura puede ser costosa. Entonces, si te entiendo bien, debería mantener la conexión abierta. Pero, ¿qué sucede si el usuario va a la pantalla de inicio? ¿Debo cerrarlo en OnPause() y abrir de nuevo en onResume()? ¿Cómo puedo pasarlo entre Intentos? – Fixus

3

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(); 
    } 
} 
94

Según this post by a Google engineer (Dianne Hackborn), no hay nada malo con el cese de la conexión de base de datos abierta:

androide hizo una decisión de diseño deliberada que se puede parecer sorprendente, simplemente renunciar a la idea de aplicaciones limpiamente saliendo y en vez de dejar que el kernel limpie sus recursos. Después de todo, el kernel necesita poder hacer esto de todos modos. Teniendo en cuenta ese diseño, mantener todo abierto durante toda la duración de un proceso y nunca cerrarlo simplemente no es una fuga. Se limpiará cuando se limpie el proceso .

Así que, para simplificar, que se extendería la clase de aplicaciones para proporcionar un único punto de entrada bien definido para su código, y abrir la conexión de 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 resto de su código.

Entonces, no se preocupe por cerrarlo.

+2

Para la corrección de quik esta es una buena respuesta, pero probablemente esto se puede hacer mejor haciendo un buen flujo de programa y, en primer lugar, planeando. –

+5

@ JānisGruzis, ¿cómo serían las alternativas "mejores" que algo que siempre funciona, y es extremadamente simple? –

+2

Salir de la conexión a la base de datos abierta parece una mala práctica, incluso si se dice que se cerrará después de la aplicación, no he encontrado la descripción de este comportamiento en la documentación de Android y, de ser así, eso siempre significa más trabajo para Android (mantener conexiones y cerrarlas). Además, ¿qué ocurre si dos aplicaciones funcionan juntas (podrían funcionar al mismo tiempo que Servicio y Actividad) y ambas mantienen abierta la conexión. Por supuesto, este no es el caso y esa es la razón por la que di el voto para esta solución. –

Cuestiones relacionadas