Лучшее место, чтобы закрыть соединение с базой данных

44

Я искал какое-то время для ответа на мой вопрос, но я не получил то, что мне нужно. У меня есть приложение с ListView и форма, где я могу добавить новую запись в БД. Поэтому запросов не так много.

Как обрабатывать соединения с db? Должен ли я закрыть его после получения того, что я хочу, или я должен держать его открытым все время, пока приложение не будет закрыто? Я хочу знать, что лучше всего, думая о производительности и времени автономной работы.

Теги:
database

3 ответа

92

В соответствии с этот пост инженером Google (Dianne Hackborn), нет ничего плохого в том, что вы не открываете соединение с базой данных:

Android сделал преднамеренное дизайнерское решение, которое может показаться неожиданным, просто отказаться от всей идеи приложений, выходящих чисто вместо этого ядро ​​очистит свои ресурсы. В конце концов, Ядро должно быть в состоянии сделать это в любом случае. Учитывая, что дизайн, хранение все, что открыто для всего процесса жизненного цикла и никогда не закрывает его, просто не является утечкой. Он будет очищен, если процесс очищается.

Итак, для простоты я бы расширил класс Application, чтобы обеспечить единую четко определенную точку входа для вашего кода и открыть соединение с базой данных в onCreate(). Храните соединение с БД в качестве поля в приложении и предоставляйте метод доступа, чтобы сделать доступным соединение для остальной части вашего кода.

Тогда не беспокойтесь о его закрытии.

  • 2
    Для быстрого исправления это хороший ответ, но, вероятно, это можно сделать лучше, если обеспечить хороший поток программ и, в первую очередь, планирование.
  • 5
    @ JānisGruzis, как бы альтернативы были «лучше», чем то, что всегда работает и является чрезвычайно простым?
Показать ещё 8 комментариев
4

Установление подключения к базе данных дорого. Если соединений не хватает, а база данных локальная, я бы сохранил соединение открытым, а не устанавливал его для каждой операции записи в базу данных, как это обычно бывает в клиент-серверном приложении, которое необходимо масштабировать до для размещения большого количества одновременных пользователей.

  • 1
    Да, я обнаружил, что открытие может быть дорогим. Поэтому, если я вас хорошо понимаю, я должен держать связь открытой. Но что, если пользователь перейдет на главный экран? Должен ли я закрыть его в onPause () и открыть снова в onResume ()? Как я могу передать его между Intents?
3

В общем, я бы закрыл соединение в функции onDestroy() Activity, которая открыла соединение. Я бы закрыл() курсор из базы данных в функции, которая использует курсор.

public MyActivity extends Activity{
    private myDatabase mDatabase; // myDatabase extends SQLiteOpenHelper
    private Cursor mCursor;

    public MyActivity(Context context){
        super(context);
        initMemberVariables();
    }

    public ElementButton(Context context, AttributeSet attrS){
    super(context, attrS);
        initMemberVariables();
    }

    public ElementButton(Context context, AttributeSet attrS, int defStyle){
        super(context, attrS, defStyle);
        initMemberVariables();
    }

    private void initMemberVariables(){
        mDatabase = new PSEdb(this.getContext());
    }

    private void getData(){
        mCursor = mDatabase.MyGetterFunction();
        while(mCursor.moveToNext()){
            try{
                // populate your data
            }catch(CursorIndexOutOfBoundsException ex){
                // handle the exception
            }
        }
        mCursor.close();
    }

    @Override
    public void onDestroy(){
        super.onDestroy();
        mDatabase.close();
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню