2013-03-11 88 views
5

我的問題是關於數據庫異常處理的良好做法。Android:我應該如何處理數據庫訪問異常?

讓我說我有一個存儲在數據庫中的一些數據的應用程序。有以下幾層實現:

  1. DatabaseAdapter - 處理SQL查詢並以模型的形式向上層提供數據。適配器包含一個方法,如:
    • 列表getAllUsers()
    • 無效ADDUSER(用戶的usermodel)
  2. UserListActivity - 顯示所有用戶的列表,允許添加新的用戶等。本次活動採用DatabaseAdapter讀取/寫入數據庫。

問題是:我應該處理數據庫訪問的例外情況,例如添加新記錄時(假設記錄應該總是正確添加)?我只是試着在DatabaseAdapter中捕獲異常並將其添加到日誌中?或者,也許我不應該抓住它?

回答

4

大多數情況下,查詢數據庫時的異常是「開發時間」錯誤(如格式錯誤的查詢)或修改模式但不增加數據庫版本或類似的結果。這些將很容易找到並立即修復,因此您的最終用戶不會受到這些類型的錯誤的影響。

然而,也有,你可能有例外在下列情況下實際可能性:

  • 您嘗試訪問從多個進程的SQLite數據庫(後患無窮)。
  • 用戶用盡設備上的磁盤空間。
  • 由於沒有正確轉義用戶輸入,因此您的查詢格式不正確。
  • 在你的onUpgrade()方法或類似的東西有一個錯誤。
  • 您正在使用參照完整性(可能在SQLite 3.6.19及更高版本中),並且某些表約束失敗。

真的,這些場景沒有普遍的答案。對於最終用戶來說,顯示一個簡單的錯誤要比關閉應用程序組更好。

我的經驗法則是不惜一切代價避免數據庫損壞。我更願意拋出一個RuntimeException並立即殺死該應用程序,而不是讓它默默地做錯事。此外,我寧願顯示一條消息,說插入無法完成,而不是強制關閉應用程序。

0

對於這個始終適合的問題,沒有共同的答案。這取決於用例。總是應用兩個規則:不要將過於詳細的異常消息傳遞到上面的層(UI不需要知道SQL語法中的問題),並在有意義時處理異常(不要在你的數據庫類中顯示一個錯誤對話框)。例如,您可以在數據庫類中捕獲數據庫異常,將其記錄下來,然後重新拋出一個自定義的CustomerNotFoundException,該UI在UI中可以顯示錯誤對話框。

相關問題