【问题标题】:Application did not close the cursor or database object that was opened here :应用程序没有关闭在此处打开的游标或数据库对象:
【发布时间】:2011-06-26 20:17:01
【问题描述】:

我的代码是:

public class EventDataSQLHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "my.db";
}

public class Test extends Activity {
    EventDataSQLHelper eventsData;

    @Override
    protected void onDestroy() {
        System.out.println("onDestroy");
  
        close();
        if (db!=null){
       
        db.close();
        
    }
    super.onDestroy();
}

public void close() {
    eventsData.close();
}

我已经在这里关闭了数据库。在我所有的活动中,除了这个它正在工作(没有显示异常)。在这里,当我从这个测试活动中按下返回按钮时,会引发以下异常

02-14 15:59:34.642: ERROR/Database(535): close() was never explicitly called on database '/data/data/com.tesy.connect/databases/test.db' 
02-14 15:59:34.642: ERROR/Database(535): android.database.sqlite.DatabaseObjectNotClosedException: Application did not close the cursor or database object that was opened here
02-14 15:59:34.642: ERROR/Database(535):     at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1810)
02-14 15:59:34.642: ERROR/Database(535):     at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:817)
02-14 15:59:34.642: ERROR/Database(535):     at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:851)
02-14 15:59:34.642: ERROR/Database(535):     at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:844)
02-14 15:59:34.642: ERROR/Database(535):     at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:540)
02-14 15:59:34.642: ERROR/Database(535):     at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
02-14 15:59:34.642: ERROR/Database(535):     at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98)
02-14 15:59:34.642: ERROR/Database(535):     at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:158)
02-14 15:59:34.642: ERROR/Database(535):     at com.connect.Test.getEvents(Connect_EY.java:755)
02-14 15:59:34.642: ERROR/Database(535):     at com.connect.Test.onCreate(Connect_EY.java:662)
02-14 15:59:34.642: ERROR/Database(535):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
02-14 15:59:34.642: ERROR/Database(535):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
02-14 15:59:34.642: ERROR/Database(535):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
02-14 15:59:34.642: ERROR/Database(535):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
02-14 15:59:34.642: ERROR/Database(535):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
02-14 15:59:34.642: ERROR/Database(535):     at android.os.Handler.dispatchMessage(Handler.java:99)
02-14 15:59:34.642: ERROR/Database(535):     at android.os.Looper.loop(Looper.java:123)

在此 getEvents 行上引发异常:

public class Test extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.pageview);

    startRefreshActivity();
    try { /* If No Record Exists Create a New One */
    eventsData = new EventDataSQLHelper(this);
    Cursor cursor = getEvents();
    startManagingCursor(cursor);

    } 
}

private Cursor getEvents() {
    try {
        db = eventsData.getReadableDatabase();
        Cursor cursor = db.query(EventDataSQLHelper.TABLE, null, null,
            null, null, null, null);
        startManagingCursor(cursor);
        return cursor;
    } catch (Exception ex) {
        System.out.println("Exception Occured : " + ex.toString());
        return null;
    }
}

例外:

02-14 15:59:34.642: ERROR/Database(535):     at com.testconnect.Test.getEvents(Test.java:755)
02-14 15:59:34.642: ERROR/Database(535):     at com.testconnect.Test.onCreate(Test.java:662)

【问题讨论】:

  • 尝试在 onStop() 处关闭光标;试试这个 if(db!=null){ db = eventsData.getReadableDatabase(); }
  • @Vamsi 我试过了,但是那里抛出了空指针异常
  • 你为 SQLiteOpenHelper 类实现了 onCreate() 和 onUpgrade() 吗?
  • @Vamsi 我已经实现了@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 和 @Override public void onCreate(SQLiteDatabase db) { 在我的公共类 EventDataSQLHelper 扩展 SQLiteOpenHelper {

标签: android sqlite android-cursor


【解决方案1】:

我解决了异常。我在打电话

 db = eventsData.getReadableDatabase(); 

这就是抛出异常的两倍

【讨论】:

    【解决方案2】:

    你试过了吗:

         Cursor cursor = getEvents();
         startManagingCursor(cursor);
         cursor.close();
    

    ?

    【讨论】:

    • 我已经这样做了.. 但仍然显示异常。它显示在行 Cursor cursor = getEvents();在 getEvents 方法中 db = eventsData.getReadableDatabase();光标 cursor = db.query(EventDataSQLHelper.TABLE, null, null, null, null, null, null);在 Logcat 中,在这些行中抛出异常
    • 我也面临这个应用程序没有关闭在此处打开的游标或数据库对象:问题..如何解决..请帮助
    【解决方案3】:

    你有没有试过像cursor.close这样在传递返回值后关闭光标

      private Cursor getEvents() {
         try {
                db = eventsData.getReadableDatabase();
                Cursor cursor = db.query(EventDataSQLHelper.TABLE, null, null,
                 null, null, null, null);
                startManagingCursor(cursor);
                cursor.close();
                return cursor;
    
             } catch (Exception ex) {
                  System.out.println("Exception Occured : " + ex.toString());
                  return null;
          }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-04
      • 2014-09-21
      • 1970-01-01
      相关资源
      最近更新 更多