Несколько вопросов о курсорах базы данных SQLite в Android

Чтобы реализовать доступ к базе данных в моем приложении, я следовал учебнику Ларса Фогеля , но меня очень смущает пара вещей ...

1) Каждый раз, когда делается вызов fetchTodo , создается и возвращается новый курсор. Оставив предыдущий курсор для сборщика мусора. Итак, если я не использую startManagingCursor или даже CursorLoader , если на то пошло, я должен вызвать .close () на курсоре, когда я закончу с ним? За пределами области fetchTodo , конечно, пример:

Cursor cursor = mNotesAdapter.fetchTodo();
// do something...
cursor.close();

Я закончил с этим курсором, и новый будет создан при следующей выборке. Если я закрою его таким образом или оставлю его для уборщик мусора? Хотя я думаю, что говорю о двух совершенно разных вещах ... Дело в том, следует ли мне закрывать его, как в примере выше, или нет?

2) Курсор также имеет .deactivate () , и в документации говорится, что он использует меньше ресурсов (чем активные курсоры). Когда именно я должен это использовать? Например, в моем приложении у меня есть ListActivity , который заполняется через SimpleCursorAdapter (инициализация кода для этого вызывается только один раз). Используемый курсор является переменной-членом класса, потому что мне он нужен вне метода, заполняющего список. Мне нужно, чтобы он запрашивал базу данных, когда что-то из нее удаляется. Но до тех пор, пока запись не будет удалена, что является действием пользователя и может занять некоторое время, следует ли мне тем временем деактивировать курсор? Потому что он снова будет активен, когда я снова вызову .requery () . Или SimpleCursorAdapter перестанет работать, потому что курсор не активен?

РЕДАКТИРОВАТЬ: Я только что протестировал этот и обнаружил, что не могу вызвать deactivate () после настройки адаптера курсора. Список будет пустым, если курсор не активен, поэтому он должен оставаться активным, пока отображается ListActivity.В конце концов, мы должны просто позволить StartManagingCursor обработать это. Или новый CursorLoader .

3) Я знаю, что startManagingCursor / stopManagingCursor устарели, но я не нацелен на Honeycomb (по крайней мере, на данный момент), и я не хочу А пока займемся новым CursorLoader . Но в приведенном выше руководстве startManagingCursor используется везде, а stopManagingCursor ни разу не вызывается. Почему нет? Android решает это по-своему? В любой ситуации я должен позвонить stopManagingCursor ?

6
задан Alex Lockwood 23 May 2012 в 04:05
поделиться