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

时间:2015-06-12 11:38:01

标签: android cursor

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

我怀疑正确的方法:

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

或者:

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

    cursor.close();
}

4 个答案:

答案 0 :(得分:2)

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

上述声明的唯一例外是,如果您知道相关的Cursor由某个“外部”框架管理,并且会在没有您的互动的情况下自动关闭({{1}的情况)与LoaderManager)一起使用的框架。

关闭任何非空CursorLoader至少两个(好的)原因:

  1. Cursor可以有“内存分配”,即使它们是空的,也需要明确释放(如Cursors所示)
  2. 如果调用AbstractWindowedCursor,则空Cursor可能变为非空。您明确阻止此操作的方法是关闭requery()
  3. 最普遍且容易出错的方法是(在某些情况下这是一种过度杀伤):

    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(); 比较不要感觉不好 - 在这些情况下这是完全合理的。

答案 1 :(得分:0)

关闭“空”光标不会伤害您的应用,无论如何都要打电话。

理论上,如果你不关闭它就不会有任何影响,但无论如何都要关闭它,恕我直言。

答案 2 :(得分:0)

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

Move the cursor to the first row.

This method will return false if the cursor is empty.

它说如果Cursor 为空,它将返回false,而不是null。 Android如何知道光标是否为空?确实,它会打开所说的光标。

所以是的,你仍然需要关闭它。

答案 3 :(得分:0)

if (myCursor.moveToFirst()) {
    do {

          // work .....

    } while (myCursor.moveToNext());
}

或者只是......

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