私が構築している PoC Android アプリではandroid.database.sqlite.DatabaseObjectNotClosedException
、アプリの終了時にガベージ コレクターが呼び出されたときにエラーが発生します。SQLiteDatabase
これは、使用している とSQLiteOpenHelper
オブジェクトの両方で close メソッドを呼び出している場合でも発生します。
コンストラクターでDBを開くためのコードを保持するDAO(から呼び出される)を使用してDBにアクセスしてAsyncTask.doInBackground
います。Activity
このコンストラクターはonCreate()
アクティビティのメソッドから呼び出されます。
//Code in my DAO class
public MyDataSource(Context context) {
dbHelper = new MyOpenHelper(context);
dbHelper.createDatabase();
}
//Calling Activity
MyDataSource myDs;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.create);
myDs= new MyDataSource (MyActivity.this);
}
@Override
public void onPause() {
investmentDs.close();
if(ConstantValues.DebugModeManager.DEBUG_CREATE || ConstantValues.DebugModeManager.DEBUG_MODE) {
Log.d(LOG_TAG, "Create screen paused...");
}
super.onPause();
}
同じアクティビティのメソッドから呼び出されるSQLiteDatabase
、オブジェクトと同様に閉じるためのメソッドもあります。データベースの読み取り/書き込みは、AsyncTask のメソッドで実行されます。SQLiteOpenHelper
onPause()
doInBackground
次close()
のようにメソッドをオーバーライドしました。SQLiteOpenHelper
@Override
public synchronized void close() {
if(database != null)
database.close();
super.close();
}
close()
これをDAO クラスのメソッドから呼び出しています。
さらに説明が必要な場合はお知らせください。
ありがとう、
デボジット
編集 1:
これは、db から取得するためのコードです。
cursor = db.query("EMPLOYEES", null, whereClause, null, null, null, "EMPLOYEE_ID");
cursor.moveToFirst();
List<MyBean> beans = new ArrayList<MyBean>();
while(!cursor.isAfterLast()) {
beans.add(cursorToObject(cursor)); //this fetches data from the cursor's current row
cursor.moveToNext(); // and inserts into a POJO of type MyBean
}
cursor.close();