И requery()
, и deactivate()
устарели (первый после API 11, последний после API 16).Я отвечаю на этот почти 7-летний вопрос, потому что считаю, что пока нет правильного ответа.
По моему опыту, повторное использование объекта Cursor
- плохая практика. Моя реализация класса SQLiteOpenHelper
имеет несколько методов, и я закрываю объект Cursor
во всех них - и я полагал, что, поскольку я закрывал объект Cursor
в конце каждого метода, это было правильно.Но в некоторых методах я повторно использовал один объект Cursor
для сохранения в нем результатов нескольких запросов (сначала я запустил запрос, затем прочитал и использовал результат из Cursor
, а затем запустил другой запрос, которыйЯ думал, что просто перезаписать старый результат в уже используемый Cursor
).Включение StrictMode
доказало, что я не прав.Я начал получать DatabaseObjectNotClosedException
сбои.
Я исправил это, больше не повторяя использование объекта Cursor
.Теперь я создаю новую переменную Cursor
для каждого запроса, затем читаю и сохраняю результаты и вызываю метод close()
для Cursor
и больше не использую его.Если мне нужно выполнить другой запрос в этом методе, я сознательно больше не использую старый Cursor
и всегда создаю новую переменную.Я не получаю больше предупреждений или сбоев, даже если StrictMode
включен.Я считаю, что сборщик мусора выполняет свою работу правильно, поэтому я не думаю, что создание нескольких экземпляров класса Cursor
является огромной проблемой.Повторное использование только одного Cursor
объекта, с другой стороны, похоже на проблему - отсюда ваши предупреждения и мои сбои с StrictMode
.
Я не эксперт по базам данных, и я все еще учусьлучшие практики в программировании под Android, но я считаю, что в этом вопросе я прав - не используйте повторно Cursor
объектов, иначе вы можете начать получать утечки памяти, предупреждения и, возможно, даже сбои.