/ / android: dobbiamo chiudere Db dopo aver chiuso il cursore - android, sqlite

android: dobbiamo chiudere Db dopo aver chiuso il cursore - android, sqlite

Dal codice sorgente di SQLiteCursor (stack stack):

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)

Significa che chiudendo l'ultimo cursore si chiuderà anche il database. E non è necessario chiuderlo esplicitamente, 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();
}
}

quindi qui, non è necessario chiudere l'rdb?

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

risposte:

2 per risposta № 1

Devi chiuderlo. Il database non verrà chiuso fino a quando non lo si sarà esplicitamente chiuso e tutti i cursori attivi sono stati chiusi.