You must close all Cursors
which are not nulls, regardless of whether they have populated entries or not.
The only exception to the above statement would be if you know that the Cursor
in question is managed by some "external" framework and will be automatically closed without your interaction (as is the case with LoaderManager
framework when used with CursorLoader
).
At least two (good) reasons to close any non-null Cursor
:
- Empty
Cursors
can have "memory-allocations" which need to be explicitly released even if they are empty (as is the case with AbstractWindowedCursor
)
- Empty
Cursor
can become non-empty if requery()
is called. Your means to prevent this explicitly is to close the Cursor
The most general and error prone approach would be (it is an overkill in some cases):
Cursor c;
try {
// Assign a cursor to "c" and use it as you wish
} finally {
if (c != null) c.close();
}
Another popular pattern if you need to iterate over Cursor's
entries:
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();
Don't feel bad with one extra c != null
comparison - it is totally justified in these cases.