2011-11-01 8 views
14

Antes que nada, corrígeme si me equivoco, pero si cierras una conexión a la base de datos, no puedes usar el Cursor que obtuviste, ¿correcto?Android - ¿Se puede utilizar el cursor de SQLite después de cerrar la base de datos?

db.open(); 
Cursor c = db.query(true, "MyTable", columns, null, null, null, null, null, null); 
db.close(); 

// The Cursor is empty now because the db was closed... 
c.moveToNext(); 
Log.v(TAG, c.toString(0)); 

Entonces, ¿hay alguna forma de utilizar el Cursor después de cerrar la base de datos? ¿Hay alguna forma de pasarlo a otra parte y usarlo como un objeto? ¿O siempre tiene que dejar la conexión de la base de datos abierta hasta que haya terminado con el cursor?

Respuesta

3

En primer lugar, me corrija si estoy equivocado, pero si se cierra una conexión de base , no podrá utilizar el cursor que obtuvo de ella, ¿verdad?

Correcto.

Entonces, ¿hay alguna forma de utilizar el Cursor después de cerrar la base de datos?

No lo creo. Siempre cierro la base de datos cuando termino con el Cursor, incluso si paso el cursor a otro objeto del Cursor.

¿Hay alguna forma de pasarlo a otra parte y usarlo como un objeto ?

Cree el método return cursorobject; y utilice el método donde lo necesite. (También crear método que va a cerrar db después de haber terminado)

O qué siempre tiene que salir de la conexión de base de datos abierta hasta que terminado con el cursor?

De lo contrario, el cursor se estropeará.

0

Usé cursor.moveToLast(), y me permitió usar el cursor para la iteración después del cierre de la base de datos. No tengo idea si esto es intencional.

Sin embargo, parece que el uso previsto del marco de ayuda abierto es abrir el archivo db en el inicio de la actividad y cerrarlo cuando se destruye la actividad.

En una AsyncTask desde dentro onCreate() ...

new StartupTask().execute(); 

El AsyncTask Thread.sleep() A continuación es solo para dar tiempo suficiente para mostrar el cuadro de diálogo para que pueda ver cómo funciona. Obviamente, sáquelo cuando termine de jugar. ;)

private class StartupTask extends AsyncTask 
{ 

    private ProgressDialog progressDialog; 

    @Override 
    protected Object doInBackground(final Object... objects) 
    { 
     openHelperRef.getWritableDatabase(); 
     try 
     { 
      Thread.sleep(5000); 
     } 
     catch (InterruptedException e) 
     { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPreExecute() 
    { 
     super.onPreExecute(); 
     runOnUiThread(new Runnable() 
     { 
      public void run() 
      { 
       progressDialog = ProgressDialog.show(
        MyActivity.this, "Title", 
        "Opening/Upgrading the database, please wait", true); 
      } 
     }); 
    } 

    @Override 
    protected void onPostExecute(Object object) 
    { 
     super.onPostExecute(object); 
     progressDialog.dismiss(); 
    } 

} 

en OnDestroy() ... openHelper.close();

De lo contrario, no podrá usar Android SimpleCursorAdapter, ni nada de eso. Por supuesto, los documentos de andriod son muy escasos en este sentido.Pero, recuerde, getWriteableDatabase() siempre devuelve la misma referencia en caché, cada vez, a menos que la haya cerrado. Entonces, si va a cerrar esa referencia de cualquier manera, los hilos de fondo y lo que no, que están usando la misma base de datos, morirá.

Cuestiones relacionadas