В приложении PoC для Android, которое я создаю, я получаю android.database.sqlite.DatabaseObjectNotClosedException
, когда сборщик мусора вызывается в приложении при закрытии. Это происходит даже тогда, когда я вызываю метод close как для SQLiteDatabase
, так и для объектов SQLiteOpenHelper
, которые я использую.Android SQLite DatabaseObjectNotClosedException
Я доступ к БД с помощью DAO (так называемой от 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
, а также SQLiteOpenHelper
объектов, который вызывается из onPause()
метода той же деятельности. Чтение/запись базы данных выполняется в методе doInBackground
AsyncTask.
Я переопределен метод close()
для SQLiteOpenHelper
следующим образом:
@Override
public synchronized void close() {
if(database != null)
database.close();
super.close();
}
Я звоню это из метода close()
в моем классе DAO.
Пожалуйста, дайте мне знать, если потребуется дополнительное разъяснение.
Спасибо,
Debojit
EDIT 1:
Это код для выборки из БД.
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();
Я закрываю курсор _immediately_ после того, как я беру данные и загружаю их в 'ArrayList'. – Debojit