2011-08-17 15 views
5

dal codice sorgente di SQLiteCursor (stack trace):Android: abbiamo bisogno di chiudere Db dopo aver chiuso il cursore

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) 

Vuol dire che, chiudendo l'ultimo del cursore sarà anche chiudere il database. E noi non hanno bisogno per chiuderla in modo esplicito, come in questo codice:

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

ecco, Non abbiamo bisogno di chiudere il rdb?

nota: l'oggetto del cursore mantiene il riferimento al database, quindi ottiene un blocco su ogni query. Pertanto 'SQLiteDatabse.dbclose' chiude in modo efficace lo stesso database.

risposta

2

È necessario chiuderlo. Il database non sarà chiuso fino a quando non lo avrai chiuso esplicitamente e tutti i cursori attivi sono stati chiusi.

+1

lo stack-trace mostra che il cursore di chiusura tenta anche di chiudere il database. in tale scenario, la chiusura del DB non dovrebbe essere necessaria. Per favore, menziona se mi manca qualche punto qui. – PushpRaj

+1

Ho appena detto quello che ti manca. :/È inoltre necessario chiudere il database. Non verrà chiuso al punto che stai guardando qui se il database non è stato già esplicitamente chiuso da te (e sta solo aspettando che tutti i cursori in sospeso siano chiusi prima di arrestare effettivamente). – hackbod

+0

Da quello che ho visto, Se si tenta di chiudere il database e quindi chiudere il cursore, si otterrà la seguente eccezione: 'Impossibile eseguire questa operazione perché il pool di connessioni è stato chiuso. Quindi non aspetterà il cursore. – ElyashivLavi

Problemi correlati