在Android中关闭游标/数据库

时间:2015-09-01 08:48:30

标签: android android-sqlite android-cursor android-database

以下是代码:

public List<XImage> getXImages()
{
    List<XImage> images = new ArrayList<XImage>();

    SQLiteDatabase database = this.getWritableDatabase();

    String sql = String.format("SELECT %s, %s, %s FROM %s",
            A, B, C, TABLE);

    Cursor result = database.rawQuery(sql, null);

    if (result.moveToFirst())
    {
        do
        {
            String a = result.getString(0);
            String b = result.getString(1);
            String c = result.getString(2);

            XImage image = new XImage(a, b, c);
            images.add(image);
        }

        while (result.moveToNext());
    }

    result.close();
    database.close();

    return images;  
}

如果在result.close();之后我放了database.close();我得到一个运行时异常,说它在连接关闭时尝试访问SqliteDatabase。

关闭游标是否也会关闭数据库连接?如果没有,我应该做些什么?

2 个答案:

答案 0 :(得分:2)

之前我遇到过类似的问题,在每个使用数据库的方法的最后,我都有database.close();,有时会抛出异常。

从代码周围删除database.close();,只保留游标关闭语句,你应该没问题。

答案 1 :(得分:0)

我猜你是从不同的线程调用该方法。

但是在我看来,最佳做法是永远不会关闭数据库,因为SQLiteOpenHelper.getWritableDatabase()SQLiteOpenHelper.getReadablDatabase()总是在未调用SQLiteOpenHelper.close()的情况下返回相同的实例。所以像你这样的调用方法会弄乱SQLiteDatabase实例的生命周期,这会增加异常。

您可能想要查看此链接:

http://touchlabblog.tumblr.com/post/24474750219/single-sqlite-connection

SQLiteOpenHelper的源代码:

https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/database/sqlite/SQLiteOpenHelper.java