【问题标题】:What is the significance of closing the cursor in android sqlite?android sqlite中关闭光标有什么意义?
【发布时间】:2017-12-10 04:36:44
【问题描述】:

在读取 sqlite 方法以使用 cursor 读取行时,我了解到在从游标中检索数据后,我们应该关闭游标以避免任何内存泄漏,但在这里我怀疑在关闭游标后调用cursor.getCount() 下面的代码?关闭游标后检索数据是不是错了? 谁能解开这个疑惑! 提前致谢!!

public int getContactsCount() {
    String countQuery = "SELECT  * FROM " + TABLE_CONTACTS;
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(countQuery, null);
    cursor.close();

    // return count
    return cursor.getCount();
}

【问题讨论】:

  • 这对我来说看起来不对,但无论如何你为什么不在关闭光标之前拨打getCount 电话?
  • 我是从一个知名网站上读到的代码,所以我认为应该是正确的?
  • 我不敢相信我们需要关闭游标来获取行数。这个知名网站是什么?我在 SO 上看到的所有示例都在关闭游标之前获取行数。
  • 计数后为什么不关闭光标?
  • 如果使用try/finally,可以关闭return后面的光标。无论如何,要计算行数,您应该改用queryNumEntries()

标签: android sqlite


【解决方案1】:

这里是SQLiteCursor#close()的源代码:

 @Override
 public void close() {
     super.close();
     synchronized (this) {
         mQuery.close();
         mDriver.cursorClosed();
     }
 }

这里是SQLiteCursor#getCount()的源代码:

  @Override
  public int getCount() {
      if (mCount == NO_COUNT) {
          fillWindow(0);
      }
      return mCount;
}

如您所见,行数似乎存储在变量mCount 中,并且在关闭游标时不会重置此值。从效率的角度来看,这可能是有道理的,因为它省去了不必要地清除状态的需要。

所以看起来关闭游标后获取计数确实有效,但您可能不应该依赖它,因为 Javadoc 没有做出这样的保证,并且这种行为以后可能会改变。

【讨论】:

  • 很好的解释!我明白了。谢谢。
【解决方案2】:

Cursor.getCount()

在您的查询中,我认为代码没有错,因为 getcount() 方法只返回游标中的行数,我们没有从游标中检索任何数据

【讨论】:

  • 我认为应该是这个原因,但我不明白那么关闭游标可以防止哪些类型的内存泄漏?
  • Close() 方法关闭游标,释放其所有资源并使其完全无效。This Article 似乎很好地覆盖了资源泄漏。行为不一致,并不总是很明显,但some people 已经谈到了一些副作用。
猜你喜欢
  • 2011-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-09
  • 1970-01-01
  • 1970-01-01
  • 2014-05-17
  • 2012-03-07
相关资源
最近更新 更多