Android:在关闭游标后是否需要关闭数据库?

5

来自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

你确实需要关闭它。除非你显式地关闭它并且所有活动的光标都已关闭,否则数据库将不会关闭。


1
堆栈跟踪显示关闭游标也尝试关闭数据库。在这种情况下,关闭DB不应该是必要的。如果我漏掉了什么,请指出。 - PushpRaj
1
我刚刚说了你缺少的内容。 :/ 你还需要关闭数据库。如果数据库没有被你明确地关闭(而只是在等待所有未完成的游标关闭后才真正关闭),那么在你这里查看的时候,它不会被关闭。 - hackbod
从我的观察来看,如果你尝试关闭数据库然后关闭游标,你会得到以下异常:Cannot perform this operation because the connection pool has been closed. 所以它不会等待游标。 - ElyashivLavi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接