如果 moveToFirst() 为 false,是否需要关闭 Cursor?

Do I need to close a Cursor if moveToFirst() is false?

如果cursor.moveToFirst() returns false 还需要关闭吗? 因为当光标为空时它 returns false。

我对正确的方法存疑:

if (cursor != null && cursor.moveToFirst()) {
    // some code
    cursor.close();
}

或者:

if(cursor != null) {
    if (cursor.moveToFirst()) {
        // some code
    }

    cursor.close();
}

关闭 "empty" 游标不会损害您的应用程序,无论如何都要调用它。

理论上不关闭不会有任何副作用,但无论如何都要关闭,恕我直言。

来自 Cursor.moveToFirst() 的官方文档:

Move the cursor to the first row.

This method will return false if the cursor is empty.

它说如果 Cursorempty,它将 return false,而不是 null。 Android 怎么知道光标是否为空?确切地说,它将打开所述光标。

是的,您仍然需要关闭它。

if (myCursor.moveToFirst()) {
    do {

          // work .....

    } while (myCursor.moveToNext());
}

或者干脆...

while (cursor.moveToNext()) {
    // use cursor
}

您必须关闭所有非空值的 Cursors,无论它们是否填充了条目。

上述声明的唯一例外是,如果您知道所讨论的 Cursor 由某个 "external" 框架管理,并且会在您不参与的情况下自动关闭(例如LoaderManagerCursorLoader) 一起使用的框架。

至少有两个(好的)理由关闭任何非空 Cursor:

  1. Empty Cursors 可以有 "memory-allocations" 即使它们是空的也需要显式释放(如 AbstractWindowedCursor 的情况)
  2. 如果调用 requery()
  3. Cursor 可以变为非空。明确防止这种情况的方法是关闭 Cursor

最普遍和最容易出错的方法是(在某些情况下这是一种矫枉过正的方法):

Cursor c;
try {
    // Assign a cursor to "c" and use it as you wish
} finally {
    if (c != null) c.close();
}

另一种流行的模式,如果你需要遍历 Cursor's 个条目:

if (c != null && c.moveToFirst()) {
    do {
        // Do s.t. with the data at current cursor's position
    } while (c.moveToNext());
}
if (c != null) c.close();

不要因为额外的 c != null 比较而感到难过 - 在这些情况下这是完全合理的。