2014-09-13 66 views
1

我有其中一個函數創建一個數據庫處理器和調用該對象內的功能的片段:的Android getWritableDatabase拋出的NullPointerException僅有時

final DatabaseHandler db = new DatabaseHandler(getActivity()); 
String teamName = db.getTeamName(); 

與數據庫處理器構造之中:

Context context; 

public DatabaseHandler(Context contextPassed) { 
    super(contextPassed, DATABASE_NAME, null, DATABASE_VERSION); 
    context = contextPassed; 

} 

某處內分貝.getTeamName()(通過另一個函數)我有:

SQLiteDatabase db = this.getWritableDatabase();//exception here! 

這工作正常99%的時間。但是,如果應用程序在後臺運行了一段時間,我又恢復了它,我得到一個NullPointerException。這很難複製,因爲在這種情況發生之前,應用程序需要處於背景中很久。它讓我想起垃圾收集?該過程由廣播意圖開始 - 不知道這是否相關。我無法真正調試它,因爲我無法複製它 - 但每天早上當我醒來時,我都會測試它,它會崩潰。開始新的一天並不是一個好的方式,它讓我瘋狂! logcat的:

threadid=1: thread exiting with uncaught exception (group=0x400259f8) 
FATAL EXCEPTION: main 
java.lang.RuntimeException: Error receiving broadcast Intent { act=updateSettingsTeamName } in [email protected] 
    at android.app.ActivityThread$PackageInfo$ReceiverDispatcher$Args.run(ActivityThread.java:938) 
    at android.os.Handler.handleCallback(Handler.java:587) 
    at android.os.Handler.dispatchMessage(Handler.java:92) 
    at android.os.Looper.loop(Looper.java:144) 
    at android.app.ActivityThread.main(ActivityThread.java:4937) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:521) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.NullPointerException 
    at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98) 
    at com.gcm.goalpocket.DatabaseHandler.getUserID(DatabaseHandler.java:529) 
    at com.gcm.goalpocket.DatabaseHandler.getTeamName(DatabaseHandler.java:563) 
    at com.gcm.goalpocket.Settings.setTeamName(Settings.java:310) 
    at com.gcm.goalpocket.MainActivity$4.onReceive(MainActivity.java:257) 
+0

,如果你需要的數據庫讀取然後使用getReadableDatabse()只調用getWritableDatabase();當你需要寫數據。 – 2014-09-13 10:15:46

+0

我現在就試試 - 可惜我沒有辦法測試,直到早上! – Cem 2014-09-13 10:24:35

回答

0

在廣播接收器在您的堆棧跟蹤的onReceive()所示,使用傳入的Context爲您的上下文傳遞給助手的構造函數。

在您的廣播接收機運行時,無法保證活動作爲有效的Context存在。

+0

謝謝Laalto&Imtiyaz - 今天早上醒來沒有錯誤! – Cem 2014-09-15 15:29:47

相關問題