在android sqlite中关闭光标的意义是什么?

在android sqlite中关闭光标的意义是什么?,android,sqlite,Android,Sqlite,在使用游标读取行的sqlite方法时,我了解到从游标中检索数据后,我们应该关闭游标以避免内存泄漏,但我怀疑在下面的代码中,关闭游标后是否调用游标.getCount()?关闭光标后检索数据不是错误吗? 任何人都可以澄清这个疑问! 提前谢谢 public int getContactsCount() { String countQuery = "SELECT * FROM " + TABLE_CONTACTS; SQLiteDatabase db = this.getReadabl

在使用
游标读取行的sqlite方法时,我了解到从游标中检索数据后,我们应该关闭游标以避免内存泄漏,但我怀疑在下面的代码中,关闭游标后是否调用
游标.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();
}
Cursor.getCount()


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

以下是的源代码:

如您所见,行计数似乎存储在变量
mCount
中,当光标关闭时,该值不会重置。从效率的角度来看,这可能是有意义的,因为它避免了不必要地清除状态的需要


因此,在关闭光标后获取计数似乎是可行的,但您可能不应该依赖它,因为Javadoc没有这样的保证,而且这种行为以后可能会改变。

我觉得这不太合适,但是在任何情况下,为什么不在关闭游标之前调用
getCount
呢?我从一个著名的网站上阅读了代码,所以我认为它应该是正确的?我不敢相信我们需要关闭游标来获得行数。这个著名的网站是什么?我在上看到的所有示例都是在关闭光标之前获取行数。为什么不在获取行数之后关闭光标?如果使用
try
/
finally
,则可以在
返回后关闭光标。无论如何,要计算行数,应该使用。我认为这应该是原因,但我不明白关闭光标会防止什么类型的内存泄漏?Close()方法关闭光标,释放其所有资源并使其完全无效。似乎能很好地覆盖资源泄漏。这种行为是不一致的,并不总是明显的,但已经谈到了一些副作用。很好的解释!我明白了。谢谢
 @Override
 public void close() {
     super.close();
     synchronized (this) {
         mQuery.close();
         mDriver.cursorClosed();
     }
 }
  @Override
  public int getCount() {
      if (mCount == NO_COUNT) {
          fillWindow(0);
      }
      return mCount;
}