Android: нам нужно закрыть Db после закрытия курсора - PullRequest
5 голосов
/ 17 августа 2011

Из исходного кода SQLiteCursor (трассировка стека):

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)

Означает ли это, что закрытие последнего курсора также закроет базу данных. И нам не нужно закрывать его явно, как в этом коде:

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

Итак, нам не нужно закрывать rdb?

примечание: объект курсора сохраняет ссылку на базу данных, поэтому он блокируется при каждом запросе. Поэтому SQLiteDatabse.dbclose фактически закрывает ту же базу данных.

1 Ответ

2 голосов
/ 17 августа 2011

Вам нужно закрыть его. База данных не будет закрыта, пока вы явно не закроете ее и все активные курсоры будут закрыты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...