2011-09-20 47 views
1

我注意到這個異常有幾個問題。但他們不能解決我的問題。DatabaseObjectNotClosedException

我有一個具有擴展SQLiteOpenHelper一個內部類databaseHelper類:

private static class OpenHelper extends SQLiteOpenHelper { 
      OpenHelper(Context context) { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
      } 

      @Override 
      public void onCreate(SQLiteDatabase db) { 
      db.execSQL("CREATE TABLE " + TABLE_NAME + "(id INTEGER PRIMARY KEY, name TEXT)"); 
      } 
      @Override 
      public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      Log.w("DBHELPER", "Upgrading database"); 
      db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); 

      onCreate(db); 
      } 


     } 

我有一個不斷更新的數據庫服務。還有一個從db中獲取數據的活動。

在這兩種服務和活動dbHelper獲得創建:

this.dh = new DatabaseHelper(this); 

而且我得到了DatabaseObjectNotClosedException。我需要關閉DatabaseHelper嗎?我會怎麼做?或者我該如何解決這個問題?

回答

3

這是需要在您的SQLiteOpenHelper以外的照顧。

只要您的活動或服務暫停/停止,就需要關閉數據庫連接。如果你不這樣做,Android會拋出你在LogCat中看到的異常。

最佳做法取決於您是否擁有全局或本地數據庫對象。

本地
使用try catch finally塊。嘗試打開數據庫,然後關閉它。這樣無論是否有錯誤,您的數據庫都會關閉。

OpenHelper dh = new DatabaseHelper(this); 
SQLiteDatabase db = null; 
try { 
    db = dh.getWritableDatabase(); 
} catch(SQLiteException e){ 

} finally { 
    if(db != null && db.isOpen()) 
     db.close(); 
} 

全球
利用Android的生命週期管理數據庫。在onResume中打開數據庫,並在中關閉它。

OpenHelper dh = null; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    dh = new DatabaseHelper(this); 
} 

@Override 
protected void onResume() { 
    this.db = dh.getWritableDatabase(); 
} 

@Override 
protected void onPause({ 
    if(db != null && db.isOpen()){ 
     db.close(); 
    } 
} 

至於你Service問題。請閱讀Service Lifecycle。您可以使用我在Global部分實施的模式。

+0

謝謝。但是,我如何在服務中處理這個問題。當需要獲取Activity時,我可能想從Service中添加到數據庫。 服務是否有onResume/onPause? – johan

+0

其實我只注意到我的一些代碼是錯誤的。它引用數據庫幫助程序,而不是實際的數據庫對象。讓我解決它。 –

+0

好的,我修復了代碼。現在檢查出來。 –