1

这是代码:

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。

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

4

2 回答 2

2

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

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

于 2015-09-01T08:53:06.700 回答
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

于 2015-09-01T09:07:53.617 回答