全部产品
云市场
云游戏

android_database_sqlite_DatabaseObjectNotClosedException

更新时间:2017-06-07 13:26:11

问题分析:

在打开数据库操作之前,应用程序没有关闭游标或数据库对象。

解决方案:

应用程序没有关闭游标或数据库对象导致抛出此类异常。通过对游标及数据库对之前打开的数据库对象调用close方法进行关闭操作即可。

示例:

  1. android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
  2. android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
  3. at android.content.ContentResolver.query(ContentResolver.java:399)
  4. at android.content.ContentResolver.query(ContentResolver.java:316)

步骤1:

使用try catch块捕获异常,并在finally部分关闭数据库。

  1. OpenHelper dh = new DatabaseHelper(this);
  2. SQLiteDatabase db = null;
  3. try {
  4. db = dh.getWritableDatabase();
  5. } catch(SQLiteException e){
  6. e.printStackTrace();
  7. } finally {
  8. if(db != null && db.isOpen())
  9. db.close();
  10. }

步骤2:

在Activity生命周期中,onResume()打开数据库,onPause()关闭数据库。

  1. OpenHelper dh = null;
  2. @Override
  3. protected void onCreate(Bundle savedInstanceState) {
  4. dh = new DatabaseHelper(this);
  5. }
  6. @Override
  7. protected void onResume() {
  8. this.db = dh.getWritableDatabase();
  9. }
  10. @Override
  11. protected void onPause( {
  12. if(db != null && db.isOpen()){
  13. db.close();
  14. }
  15. }

参考文献:

  1. http://stackoverflow.com/questions/7492006/databaseobjectnotclosedexception
  2. http://stackoverflow.com/questions/4734886/how-can-one-avoid-databaseobjectnotclosedexception
  3. http://debuglog.iteye.com/blog/1404338