【问题标题】:closing Cursor in SQLite database explicitly, needed or not needed?显式关闭 SQLite 数据库中的游标,需要还是不需要?
【发布时间】:2013-05-14 12:58:58
【问题描述】:

我了解关闭数据库后,游标变为“无效”,那是否也会同时关闭游标?这是否避免了必须做如下所示的事情?

示例 1

 public void String getResultsAndReturnString() {
      String result = "";
      SQLiteDatabase db = dbHelper.getReadableDatabase();
      Cursor cursor = qb.query(db, projection, null, null,
                    null, null, null);
      cursor.close();  <-- explicit cursor close example one
      db.close();
     return result;
  }

示例 2

public void Cursor getResultsAndReturnCursor(){
   SQLiteDatabase db = dbHelper.getReadableDatabase();
   Cursor cursor = qb.query(db, projection, null, null,
                    null, null, null);
   return cursor;
}

public void closeOut(Cursor cursor, SQLiteDatabase dataBase){
     cursor.close();   <-- explicit cursor close example two
     dataBase.close();
}

【问题讨论】:

    标签: android sqlite android-cursor


    【解决方案1】:

    游标并没有通过关闭数据库来关闭严格意义上的关闭(它仍然存在并且您可以对其执行操作),但是如您所知,关闭数据库会使游标无用。出于多种原因,您应该在使用完游标后显式关闭它们:

    1) 正如您所指出的,关闭数据库后,任何剩余的游标都变得“无效”,并且不能依赖于准确的数据;

    2) 您将在 LogCat 中看到警告;

    3) 如果您维护对游标的引用,您将面临内存泄漏的风险;和

    4) 关闭不再需要的资源是一种很好的编程习惯。

    【讨论】:

    • 游标如何映射到系统资源?那么数据库实例本身是什么?我相信 db 是映射的操作系统资源,但不能确定游标。关闭游标尝试关闭底层数据库(可能成功也可能不成功),那么这里的逻辑是什么?有什么想法吗?
    • @zgulser 我认为关于“[c] 丢失游标尝试关闭底层数据库”的断言是不正确的。游标是来自数据库而不是数据库本身的一组离散结果。因此,关闭游标对数据库没有影响。
    • 嗨,这就是我在堆栈跟踪中看到的原因。不过,它不一定要关闭它-据我所知,它只会尝试关闭它。另外,总是建议在关闭数据库之前进行一次空检查,我怀疑这可能是这个断言的原因。
    猜你喜欢
    • 2016-11-15
    • 2011-09-13
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多