2013-06-13 75 views
0

我想實現android SQLite使用設計模式,以確保每個應用程序打開SQLiteDatabase實例。無法獲得SQLite可寫數據庫

public class BaseDataSource { 

    private static final CustomSQLiteHelper dbHelper = CustomSQLiteHelper.getInstance(); 

    protected static SQLiteDatabase database; 

    static { 
     //HERE RISES EXCEPTION 
     BaseDataSource.database = BaseDataSource.dbHelper.getWritableDatabase(); 
    } 



    private void close() {  
     if(null != BaseDataSource.database && BaseDataSource.database.isOpen()) { 
      BaseDataSource.database.close(); 

      if(null != BaseDataSource.dbHelper) { 
       BaseDataSource.dbHelper.close();     
      } 
     } 
    } 

    protected BaseDataSource() {} 


    protected void finalize() throws Throwable { 
     close(); 
     super.finalize();  
    } 
} 

不過,雖然我的應用程序開始我得到這樣的例外:

Caused by: java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase: /data/data/com.xxx/databases/xxx.db 

如何SQLiteDatabse數據庫可以打開和創建類之前關閉?

修訂

我發現我自己的錯誤。它在CustomSQLiteHelper類中。在onCreate方法中,我關閉了數據庫。我嘗試了所有在互聯網上找到的解決方案,並且因爲我犯了一個錯誤。下面讓一個數據庫對象時模式

+0

極其相似exeption這裏http://stackoverflow.com/questions/6535908/android-sqlite-sqliteopenhelper-error-illegalstateexception-db-already-clo 那裏也有一個很棒的答案。 –

回答

0

用途:

try { 
    if (sDatabase != null) { 
     if (!sDatabase.isOpen()) { 
      sDatabase = sContext.openOrCreateDatabase(DATABASE_NAME, 0, null); 
     } 
    } else { 
     // open database here 
     sDatabase = sContext.openOrCreateDatabase(DATABASE_NAME, 0, null); 
    } 
    Log.d(TAG, "Database successfully opened."); 
} catch (SQLException e) { 
    Log.e(TAG, "" + e); 
} 
+0

這將確保數據庫對象是否爲null或數據庫已關閉,然後只請求獲取數據庫對象 – Shrikant

+0

openOrCreateDatabase函數如何影響SQLiteHelper原因由於支持數據庫創建和升級,我實現了CustomSQLiteHelper? –

0

使用數據庫對象爲靜態,使你的類這樣的表現。

  • 加載類時創建數據庫實例。
  • 調用finalize方法時關閉數據庫連接。
  • 您的班級將不會再獲取數據庫連接,並且它將擁有已關閉的數據庫實例。
  • 最終當試圖訪問被關閉的情況下,它會彈出錯誤給你

我認爲你應該使用不同的方法會更好。

+0

但是,靜態塊中的異常上升意味着類加載(100%是首次嘗試創建數據庫對象)。非常邏輯的答案,我同意實現很糟糕。我會嘗試重新思考。 :) –

1

如果你要事件的任何事情,然後首先需要打開爲寫入數據庫。因此,對於使用此方法 並呼籲這樣

openAsWrite(); 

    public void openAsWrite() throws SQLException { 
      db = DBHelper.getWritableDatabase(); 
     } 

     // ---closes the database--- 
     public void close() throws SQLException { 
      DBHelper.close(); 
     }