Чтобы реализовать доступ к базе данных в своем приложении, я следовал руководству Ларса Фогеля, но я очень запутался в нескольких вещах...
1) Каждый раз при вызове fetchTodo
будет создаваться и возвращаться новый курсор. Оставить предыдущий курсор для сборщика мусора. Итак, если я не использую startManagingCursor
или даже CursorLoader
в этом отношении, должен ли я вызывать .close()
для курсора, когда я закончу с ним? Конечно, за рамками fetchTodo
, пример:
Cursor cursor = mNotesAdapter.fetchTodo();
// do something...
cursor.close();
Я закончил работу с этим курсором, и при следующем извлечении будет создан новый. Должен ли я закрыть его таким образом или оставить для сборщика мусора? Хотя я думаю, что говорю о двух совершенно разных вещах... Дело в том, должен ли я закрыть его, как в примере выше, или нет?
2) Cursor
также имеет метод .deactivate()
, и в документации сказано, что он использует меньше ресурсов (чем активные курсоры). Когда именно я должен использовать это? Например, в моем приложении у меня есть ListActivity
, который заполняется через SimpleCursorAdapter
(инициализация кода для этого вызывается только один раз). Используемый курсор является переменной-членом класса, потому что он нужен мне вне метода, который заполняет список. Мне нужно, чтобы он запрашивал базу данных, когда что-то из нее удалялось. Но до тех пор, пока запись не будет удалена, что является действием пользователя и может занять некоторое время, должен ли я тем временем деактивировать курсор? Потому что он снова будет активен, когда я снова позвоню .requery()
. Или SimpleCursorAdapter
перестанет работать, потому что курсор не активен?
EDIT: я только что проверил это и обнаружил, что не могу вызвать deactivate()
после настройки адаптера курсора. Список будет пустым, если курсор не активен, поэтому он должен оставаться активным до тех пор, пока отображается ListActivity. В конце концов, мы должны просто позволить StartManagingCursor
разобраться с этим. Или новый CursorLoader
.
3) Я знаю, что startManagingCursor
/stopManagingCursor
устарели, но я не ориентируюсь на Honeycomb (по крайней мере, на данный момент) и пока не хочу иметь дело с новым CursorLoader
. Но в приведенном выше руководстве startManagingCursor
используется везде, а stopManagingCursor
ни разу не вызывается. Почему нет? Android справляется с этим по-своему? В любой ситуации я должен позвонить stopManagingCursor
?