【问题标题】:Closing cursors/database in Android在 Android 中关闭游标/数据库
【发布时间】:2015-11-26 10:26:57
【问题描述】:

代码如下:

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。

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

【问题讨论】:

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


    【解决方案1】:

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

    但是在我看来,最好的做法是永远不要关闭数据库,因为如果没有调用 SQLiteOpenHelper.close()SQLiteOpenHelper.getWritableDatabase()SQLiteOpenHelper.getReadablDatabase() 总是返回相同的实例。所以像你这样调用方法会搞乱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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 谢谢 - 但这是什么原因?
      • @b85411 如果关闭数据库,将无法再读取游标。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多