Android повторно использует курсор - PullRequest
2 голосов
/ 25 августа 2011

Является ли хорошей практикой повторное использование объекта курсора в Android для выполнения нескольких запросов к базе данных? Нужно ли вызывать deactivate () между запросами? Я деактивирую курсор после второго запроса, но все еще получаю предупреждения DatabaseObjectNotClosedException в logcat.

Ответы [ 3 ]

1 голос
/ 20 февраля 2018

И 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 объектов, иначе вы можете начать получать утечки памяти, предупреждения и, возможно, даже сбои.

0 голосов
/ 26 августа 2011

Ну, requery() устарела, но почему-то deactivate() нет.Вы не можете использовать одно без другого, так что я думаю, вы могли бы предположить, что вы не должны использовать deactivate().В любом случае, закрыв курсор, как только вы закончите, он избавится от всех этих надоедливых DatabaseObjectNotClosedException.Новая структура загрузчика поощряет возвращать новые курсоры, старые заменяются автоматически при их замене.

0 голосов
/ 26 августа 2011

По моему опыту, вы можете просто установить курсор на что-то новое.Я попытался вызвать deactivate (), но это испортило мое приложение, поэтому я решил не использовать это.Я не знаю, является ли это хорошей практикой или нет, но у меня она работала нормально, и, насколько я понимаю, она не протекает и не тормозит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...