2012-09-06 42 views
1

首先,讓我說,這個異常不會發生規律,發生在我身上只有幾次,可惜從來沒有當手機已連接並正在調試。 我得到的所有信息都來自用戶向我發送的Developer Console日誌和應用日誌。隨機SQLite數據庫更新空例外

首先,我把所有的信息是從開發人員控制檯:

Caused by: java.lang.NullPointerException 

打電話時:

//private SQLiteDatabase mDb; initialized earlier 
ContentValues args = new ContentValues(); 
args.put(KEY_ENABLED, isEnabled); 

return mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0; //exception here 

猜測,它可能通過MDB被空不知何故,我已經添加記錄在這裏引起的,知道究竟發生了什麼

//DbAdapter 
public boolean updateIsAlarmChecked(long rowId, boolean isEnabled) { 
try { 
    ContentValues args = new ContentValues(); 
    args.put(KEY_ENABLED, isEnabled); 

    return mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0; 
} catch (Exception e) { 
    Utils.log("updateIsAlarmChecked exception: " + e.getMessage()); 
    Utils.log("alarm enabled: " + isEnabled); 
    Utils.log("db is " + (mDb == null ? "null" : "not null")); 
    return false; 
} 
} 

不幸的是,收到的日誌包含:

updateIsAlarmChecked exception: null 
alarm enabled: true 
db is not null 

所以它看起來像是SQLiteDatabase內部的東西,但我怎麼才能找出究竟是什麼?或者,事實並非如此,因爲開發者控制檯沒有在該課程中顯示任何痕跡?

我也將寫什麼樣的行動造成的錯誤,也許,這將有助於

  1. 應用(據我所知)正常工作,活動產生了顯
  2. 用戶編輯報警 - 新的Activity B是打開,關於鬧鐘的信息從新創建並打開的DbAdapter中讀取(類似於NotePad Android示例中的類,如果需要,我可以提供更多的代碼)。
  3. 用戶完成編輯,他們是正確保存,B是整理意圖返回結果。其將對DBAdapter在封閉的onDestroy(我只注意到我知道這是不正確,因爲的onDestroy並不總是叫。莫非是錯誤的原因是什麼?不過,我只是試圖與註釋掉關閉運行,有沒有發生錯誤)
  4. onActivityResult被稱爲A,調用A的將對DBAdapter實例的updateIsAlarmChecked(也許這種情況是越來越「不正確」有時候?)發生
  5. 異常,並逮住,更新不成功

任何想法?所有幫助非常感謝


編輯: 最新日誌後小更新。 現在的代碼看起來像這樣:

ContentValues args = null; 
try { 
    args = new ContentValues(); 
    args.put(KEY_ENABLED, isEnabled); 
    return mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0; //null exception here 
} catch (Exception e) { 
    Utils.log("alarm enabled: " + isEnabled); //true 
    Utils.log("alarm id= " + rowId); //there is alarm with this rowId 
    Utils.log("db is " + (mDb == null ? "null" : "not null")); //not null 
    Utils.log("args is " + (args == null ? "null" : "not null")); //not null 
    Logger.logException(e); 
    return false; 
} 

最糟糕的是,堆棧跟蹤點只用return語句行 - 應該不是進一步導致「變成了」更新方法? 任何想法,我可以用它做什麼?這是可怕的,它發生只是有時只有我能回覆用戶的是「試做一遍,它不能只是有時」 ......

回答

0

我覺得你得到的,因爲你保存的方式,你的問題database!在此鏈接:SqliteSQLite沒有一個單獨的Boolean存儲類。相反,Boolean值存儲爲integers 0(false)和1(true)。所以,我認爲你應該嘗試將你的bool的值保存爲0或1.

+0

這不是說每次在給定設備上都會發生錯誤嗎?正如我寫的,它發生在我身上的2-3次數百次編輯中。此外,我在許多其他情況下以這種方式使用布爾值,並且從未造成任何問題,所以我不認爲這種情況 – Koger

+0

@Koger:您應該向我們展示更多錯誤!因爲我以前從不在數據庫中存儲布爾值,所以我不確定它是否正確!如果使用'Boolean'值保存數據庫沒有錯誤,那麼上面的代碼也沒有問題!所以,向我們展示更多錯誤日誌! –

+0

我可以告訴你什麼更多的錯誤,這是我得到的唯一一個錯誤。我從開始就在SQLite中存儲布爾值,並且從來沒有造成任何麻煩,所以我非常確定這與它無關。但是如果你確定存儲布爾值會導致麻煩,那麼這可能取決於Android版本或類似的東西,讓我知道你是否知道類似的東西 – Koger