2011-07-07 2 views
44

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

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

+1

Отличное объяснение здесь .. http://stackoverflow.com/questions/14002022/android-sq-lite-closed-exception/25379071#25379071 – Nepster

ответ

4

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

+1

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

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(); 
    } 
} 
94

Согласно this post by a Google engineer (Dianne Hackborn), нет ничего плохого в том, оставив соединение с базой данных открытым:

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

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

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

+2

Для исправления quik это хороший ответ, но, вероятно, это может быть сделано лучше, благодаря хорошему потоку программы и, прежде всего, планированию. –

+5

@ JānisGruzis, как бы альтернативы были «лучше», чем что-то, что всегда работает, и чрезвычайно просто? –

+2

Хорошо открытое соединение с базой данных похоже на плохую практику, даже если ее заявили, что она будет закрыта после того, как приложение мертво, я не встречал описания этого поведения в документах Android, и если да, это всегда означает большую работу для Android (сохранение соединений и их закрытия). Также, что происходит, если два приложения работают бок о бок (они могут работать в то же время, что и Служба и активность), и оба они поддерживают открытие соединения. Конечно, это не так, и именно по этой причине я дал голос за это решение. –

Смежные вопросы