Страницы

Поиск по вопросам

суббота, 8 февраля 2020 г.

Закрытие классов базы данных, курсоров

#android #sqlite #cursor


Подскажите пожалуйста, зачем (и как правильно) закрывать:


SQLiteDatabase класс
класс курсора (кстати, как себя поведет адаптер, подключенный к закрытому курсору)
класс-наследник SQLiteHelper


Какова практика использования? В части - открыл/закрыл объект. Может есть какая-то
последовательность закрытия этих объектов?

У меня имеются несколько классов для работы с БД, но в некоторых случаях я подряд
несколько раз использовал открытие бд, на что андроид ругается.. поэтому хочу спросить
у профессионалов, как правильно делать? Может есть подход, о котором я не знаю просто.
    


Ответы

Ответ 1



Насчет курсоров - сейчас рекомендуется использовать класс CursorLoader, который полностью управляет жизненным циклом курсора, следит за его своевременным открытием и закрытием, а так же работает с ним в параллельном потоке, что наилудшим образом сказывается на производительности приложения. При этом в таком классе можно переопределить метод выборки данных, чтобы избавить себя от необходимости заводить еще и ContentProvider, как то требуется в дефолтной реализации. Насчет закрытия БД. В одной, очень содержательной, дискуссии, Диана Хакборн (Dianne Hackborn), далеко не последний человек в подразделении андроид гугла, объясняла всем заинтересованным гражданам, что подключение к БД не только не надо закрывать, а что это еще и не очень то хорошо - закрывать это подключение. При закрытии приложения/класса, использующего подключение к БД, сборщик мусора уничтожит и классы БД и все будет в норме, в противном же случае происходят какие то страшные вещи. UPDATE Вот обсуждение на SO - там есть ссылка на дискуссию гугл-груп андроид-разработчиков, где своим мнением делится Марк Мерфи и Диана. Думаю обсуждение на SO тоже будет интересно. UPDATE2 В своих проектах я использую Realm и вообще не заморачиваюсь с БД SQLite, уже даже и не вспоминаю эти классы-помошники, курсоры, открытия-закрытия , множество всяких оберток и прочий "ужас" ... Все быстро, очень удобно и просто - работаешь, как с ORM (по принципу классов-моделей), но это нативная БД без прослоек и без SQLite

Ответ 2



Закрывать нужно из-за устранения проблем с утечкой памяти и производительностью. Адаптер который пытается подключиться к закрытому курсору выдаст ошибку. Закрывать курсор и SQLiteDatabase классе нужно тогда, когда они закончили работу. В примере ниже я закрываю курсор и бд после того как они отработали: public String getDataFromID(String row, int id) { String query = "SELECT * FROM " + ARTICLES_TABLE_NAME; SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.rawQuery(query, null); cursor.moveToFirst(); String gettingData = cursor.getString(cursor.getColumnIndex(row)); cursor.close(); db.close(); return gettingData; }

Комментариев нет:

Отправить комментарий