私は現在、最初のAndroidアプリを作成しており、ほとんどの知識はAndroidのメモ帳のチュートリアルに基づいています。
http://developer.android.com/resources/tutorials/notepad/notepad-ex3.html
私のアプリケーションでは、1つのアクティビティで複数のDBHelperを使用していますが、すべてのカーソルがstartManagingCursor()を使用してアクティビティによって管理されるわけではありません。
私は、すべてのDB接続を適切に開いたり閉じたりする必要があることを学びました。
SQLiteOpenHelper.open();
Cursor.open();
//use cursor
Cursor.close();
SQLiteOpenHelper.close();
私の知る限り、startManagingCursor()はあなたのためにこれを行います。しかし、startManagingCursor()もSQLiteOpenHelperを開いたり閉じたりしますか?
Android NotepadチュートリアルはstartManagingCursor()を使用していますが、DBHelperが閉じられることはありません。SQLiteOpenHelperが閉じられないのはなぜですか?
編集:
これは私の現在のコードです。mDriverDbHelperと呼ばれる1つのSQLiteOpenHelperを使用しています。このコードは、チュートリアルからの採用です。
プライベートDriverDbAdaptermDriverDbHelper;
/** 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();
}
このコードサンプルは機能しますが、理由がわかりません。onCreateとonStartでmDriverDBHelper.open()を2回呼び出しています。
open()およびclose()呼び出しをonPauseおよびonResumeに入れようとしましたが、エラーが発生します。
Cursor: invalid statement in fillWindow()
onPauseとonResumeではなくonStartとonStopでなければならない理由を誰かが知っていますか?
最終回答
チュートリアルにはclose()メソッド呼び出しがありません。アクティビティのライフサイクルと組み合わせてオープンとクローズを使用するための一般的なルールは次のとおりです。
アクティビティのライフサイクルメソッドでSQLiteOpenHelperを開いた後、対応する対応するライフサイクルメソッドで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を閉じる必要があります。