如果 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.
它说如果 Cursor
是 empty,它将 return false,而不是 null。 Android 怎么知道光标是否为空?确切地说,它将打开所述光标。
是的,您仍然需要关闭它。
if (myCursor.moveToFirst()) {
do {
// work .....
} while (myCursor.moveToNext());
}
或者干脆...
while (cursor.moveToNext()) {
// use cursor
}
您必须关闭所有非空值的 Cursors
,无论它们是否填充了条目。
上述声明的唯一例外是,如果您知道所讨论的 Cursor
由某个 "external" 框架管理,并且会在您不参与的情况下自动关闭(例如LoaderManager
与 CursorLoader
) 一起使用的框架。
至少有两个(好的)理由关闭任何非空 Cursor
:
- Empty
Cursors
可以有 "memory-allocations" 即使它们是空的也需要显式释放(如 AbstractWindowedCursor
的情况)
如果调用 requery()
,- 空
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
比较而感到难过 - 在这些情况下这是完全合理的。
如果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.
它说如果 Cursor
是 empty,它将 return false,而不是 null。 Android 怎么知道光标是否为空?确切地说,它将打开所述光标。
是的,您仍然需要关闭它。
if (myCursor.moveToFirst()) {
do {
// work .....
} while (myCursor.moveToNext());
}
或者干脆...
while (cursor.moveToNext()) {
// use cursor
}
您必须关闭所有非空值的 Cursors
,无论它们是否填充了条目。
上述声明的唯一例外是,如果您知道所讨论的 Cursor
由某个 "external" 框架管理,并且会在您不参与的情况下自动关闭(例如LoaderManager
与 CursorLoader
) 一起使用的框架。
至少有两个(好的)理由关闭任何非空 Cursor
:
- Empty
Cursors
可以有 "memory-allocations" 即使它们是空的也需要显式释放(如AbstractWindowedCursor
的情况)
如果调用 - 空
Cursor
可以变为非空。明确防止这种情况的方法是关闭Cursor
requery()
,最普遍和最容易出错的方法是(在某些情况下这是一种矫枉过正的方法):
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
比较而感到难过 - 在这些情况下这是完全合理的。