2011-08-17 15 views
5

a partir del código fuente de SQLiteCursor (seguimiento de la pila):androide: ¿necesitamos para cerrar Db después de haber cerrado el cursor

at android.database.sqlite.SQLiteDatabase.dbclose(Native Method) 
at android.database.sqlite.SQLiteDatabase.onAllReferencesReleased(SQLiteDatabase.java:325) 
at android.database.sqlite.SQLiteClosable.releaseReference(SQLiteClosable.java:45) 
at android.database.sqlite.SQLiteProgram.onAllReferencesReleased(SQLiteProgram.java:119) 
at android.database.sqlite.SQLiteClosable.releaseReference(SQLiteClosable.java:45) 
at android.database.sqlite.SQLiteProgram.close(SQLiteProgram.java:296) 
at android.database.sqlite.SQLiteQuery.close(SQLiteQuery.java:136) 
at android.database.sqlite.SQLiteCursor.close(SQLiteCursor.java:506) 

¿Quiere decir que, cerrando el último cursor también se cerrará la base de datos. Y no necesitamos para cerrarla de forma explícita, como en este código:

SQLiteDatabase rdb = db.getReadableDatabase(); 
    Cursor resultCursor = null; 
    String patternQuery = SQLiteQueryBuilder.buildQueryString(true, "Store", columns, where, null, null, null, null); 

    try 
    { 
     resultCursor = rdb.rawQuery(patternQuery, null); 


     resultCursor.moveToFirst(); 
     if (resultCursor.getCount() > 0) 
     { 
      while (!resultCursor.isAfterLast()) 
      { 
       result.add(resultCursor.getString(0)); 
       resultCursor.moveToNext(); 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     Log.d("DB", "Caught an exception while getting pattern based results: " + e); 
    } 
    finally 
    { 
     if (resultCursor != null) 
     { 
      resultCursor.close(); 
     } 
     if (rdb.isOpen()) 
     { 
      rdb.close(); 
     } 
    } 

así que aquí, no necesitamos para cerrar la RDB?

nota: el objeto cursor mantiene la referencia a la base de datos, por lo que consigue un ajuste en el mismo en cada consulta. Por lo tanto, 'SQLiteDatabse.dbclose' cierra efectivamente la misma base de datos.

Respuesta

2

No es necesario que lo cierre. La base de datos no se cerrará hasta que haya cerrado explícitamente y todos los cursores activos se hayan cerrado.

+1

el stack-trace muestra que el cursor de cierre también intenta cerrar la base de datos. en tal escenario, cerrar DB no debería ser necesario. Por favor mencione si me falta algún punto aquí. – PushpRaj

+1

Acabo de decir lo que te estás perdiendo. :/También necesita cerrar la base de datos. No se cerrará en el punto que está viendo aquí si la base de datos no fue cerrada explícitamente por usted (y solo está esperando que se cierren todos los cursores pendientes antes de que se cierre realmente). – hackbod

+0

Por lo que vi, si intenta cerrar la base de datos y luego cierra el cursor, obtendrá la siguiente excepción: 'No se puede realizar esta operación porque el grupo de conexiones se ha cerrado. Entonces no esperará el cursor. – ElyashivLavi

Cuestiones relacionadas