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