2011-08-11 72 views
0

我的Android應用程序中有一個用於我的Activities(WhereWolfActivity)的超類,它有一個靜態SQLiteDatabaseOpenHelper供所有子類使用。數據庫連接在onCreate中打開並在onDestroy中關閉(我跟蹤打開的子類活動的數量,以確保數據庫連接僅在應用程序中最後一個活動被銷燬時關閉)。當用戶註銷時,它們被帶到歡迎屏幕活動,該活動不具有WhereWolfActivity的子類,因此數據庫連接已關閉。但是,應用程序部隊當應用程序註銷關閉,我得到以下logcat的輸出:嘗試關閉SQLite數據庫時應用程序強制關閉

08-11 02:28:24.858: ERROR/AndroidRuntime(29022): FATAL EXCEPTION: main 
08-11 02:28:24.858: ERROR/AndroidRuntime(29022): java.lang.RuntimeException: Unable to destroy activity {uk.ac.ic.doc.vmw10.wherewolf/uk.ac.ic.doc.vmw10.wherewolf.activities.Tabs}: java.lang.NullPointerException 
08-11 02:28:24.858: ERROR/AndroidRuntime(29022):  at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3655) 
08-11 02:28:24.858: ERROR/AndroidRuntime(29022):  at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:3673) 
08-11 02:28:24.858: ERROR/AndroidRuntime(29022):  at android.app.ActivityThread.access$2900(ActivityThread.java:125) 
08-11 02:28:24.858: ERROR/AndroidRuntime(29022):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2066) 
08-11 02:28:24.858: ERROR/AndroidRuntime(29022):  at android.os.Handler.dispatchMessage(Handler.java:99) 
08-11 02:28:24.858: ERROR/AndroidRuntime(29022):  at android.os.Looper.loop(Looper.java:123) 
08-11 02:28:24.858: ERROR/AndroidRuntime(29022):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
08-11 02:28:24.858: ERROR/AndroidRuntime(29022):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-11 02:28:24.858: ERROR/AndroidRuntime(29022):  at java.lang.reflect.Method.invoke(Method.java:521) 
08-11 02:28:24.858: ERROR/AndroidRuntime(29022):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
08-11 02:28:24.858: ERROR/AndroidRuntime(29022):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
08-11 02:28:24.858: ERROR/AndroidRuntime(29022):  at dalvik.system.NativeStart.main(Native Method) 
08-11 02:28:24.858: ERROR/AndroidRuntime(29022): Caused by: java.lang.NullPointerException 
08-11 02:28:24.858: ERROR/AndroidRuntime(29022):  at uk.ac.ic.doc.vmw10.wherewolf.activities.WhereWolfActivity.onDestroy(WhereWolfActivity.java:119) 
08-11 02:28:24.858: ERROR/AndroidRuntime(29022):  at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:3642) 
08-11 02:28:24.858: ERROR/AndroidRuntime(29022):  ... 11 more 

的NullPointerException異常上這行出現:dbHelper.close();

任何想法,爲什麼試圖關閉數據庫會給一個空指針異常?

+0

dbHelper可能已經自動在活動推入後臺關閉。順便說一句,爲什麼不只是打開連接,當你需要他們? – 2011-08-11 02:49:11

+0

我對於應用程序是否最好有1個dbHelper,或者隨時打開和關閉,我看到了不同的看法,所以現在是這樣,但我不知道哪種設計最好。 – Pikaling

+0

此外,該應用程序的主要活動是一組使用遊標的選項卡,並且這些選項卡填充在異步任務中,所以我不想在運行時終止數據庫連接 – Pikaling

回答

0

我們真的不知道爲什麼沒有看到您的代碼,但顯然您的dbHelper爲空。這與試圖關閉它無關。

另一個說明,讓你的生活更簡單,併爲你的數據庫有一個單例類。至於關閉,你並不需要這麼做,只要保持開放。當你的進程死亡時,這將會關閉數據庫。確保你關閉了所有的遊標。

喜歡的東西:

public class MyDbHelper extends SQLiteOpenHelper { 

    private Context context; 

    private static MyDbHelper instance; 

    public static MyDbHelper getInstance(Context context) { 
     if (instance == null) { 
      instance = new MyDbHelper(context); 
     } 

     return instance; 
    } 

} 
+0

嗨。謝謝你的幫助。你能否詳細說明一下你的'爲你的數據庫創建一個單例類'的建議? – Pikaling

+0

查看修改後的帖子。基本上有你的數據庫幫助類的單個實例訪問您的所有活動等 –

+0

啊,我明白了。我已經將數據庫幫助作爲單例實現,但是在超類Activity中進行處理。無論如何,刪除'dbHelper.close()'語句已經停止強制關閉,現在一切似乎都很好,謝謝 – Pikaling