В настоящее время я пишу свое первое приложение для Android и основал большую часть своих знаний на учебнике по Android-блокноту:
http://developer.android.com/resources/tutorials/notepad/notepad-ex3.html
В моем приложении я использую несколько DBHelpers в одном действии, и не каждый Курсор управляется действием с помощью startManagingCursor ().
Я узнал, что каждое соединение с БД должно быть открыто и закрыто:
SQLiteOpenHelper.open();
Cursor.open();
//use cursor
Cursor.close();
SQLiteOpenHelper.close();
Насколько я знаю, startManagingCursor () делает эту работу за вас. Но startManagingCursor () также открывает и закрывает SQLiteOpenHelper?
В учебнике по Android Notepad используется startManagingCursor (), но DBHelper никогда не закрывается. Почему SQLiteOpenHelper никогда не закрывается?
EDIT:
Это мой текущий код. Он использует один SQLiteOpenHelper с именем mDriverDbHelper. Этот код взят из учебного пособия:
частный DriverDbAdapter mDriverDbHelper;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.bus_selectuser);
mDbHelper = new DbAdapter(this);
mDbHelper.open();
mDbHelper.close();
mDriverDbHelper = new DriverDbAdapter(this);
Log.w("BuerBusActivity", "opening DB connection via DbHelber now");
mDriverDbHelper.open();
fillData();
//request the screen to stay on
this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
@Override
public void onRestart() {
super.onRestart();
Log.v(TAG, "onRestart");
}
@Override
public void onStart() {
super.onStart();
mDriverDbHelper.open();
Log.v(TAG, "onStart");
}
@Override
public void onResume() {
super.onResume();
Log.v(TAG, "onResume");
}
@Override
public void onPause() {
Log.v(TAG, "onPause");
super.onPause();
}
@Override
public void onStop() {
mDriverDbHelper.close();
Log.v(TAG, "onStop");
super.onStop();
}
Этот пример кода работает, но я не понимаю, почему. Я вызываю mDriverDBHelper.open () дважды в onCreate и в onStart.
Я пытался поместить вызовы open () и close () в onPause и onResume, но это приводит к ошибке:
Cursor: invalid statement in fillWindow()
Кто-нибудь знает, почему это должно быть onStart и onStop, а не onPause и onResume?
ФИНАЛЬНЫЙ ОТВЕТ
В учебнике отсутствует вызов метода close (). Общее правило использования открытия и закрытия в сочетании с жизненным циклом деятельности:
После открытия SQLiteOpenHelper в методе жизненного цикла действия вы должны закрыть его в соответствующем методе жизненного цикла аналога.
@Override
public void onCreate() {
....
//open SQLiteOpenHelper
onCreateHelper.open();
}
@Override
public void onStart() {
....
//open SQLiteOpenHelper
onStartHelper.open();
}
@Override
public void onResume() {
....
//open SQLiteOpenHelper
onResumeHelper.open();
}
@Override
public void onPause() {
....
//close SQLiteOpenHelper
onResumeHelper.close();
}
@Override
public void onStop() {
....
//close SQLiteOpenHelper
onStartHelper.close();
}
@Override
public void onDestroy() {
....
//close SQLiteOpenHelper
onCreateHelper.close();
}
В случае учебника по Android NotePad метод onDestroy () отсутствовал и должен был закрыть mDbHelper.