Android:我应该如何处理数据库访问异常?

时间:2013-03-11 21:33:44

标签: android database exception-handling

我的问题是关于数据库异常处理的良好做法。

假设我有一个应用程序在DB中存储一些数据。实现了以下层:

  1. DatabaseAdapter - 处理SQL查询并以模型的形式向更高层提供数据。适配器包含以下方法:
    • 列出getAllUsers()
    • void addUser(UserModel user)
  2. UserListActivity - 显示所有用户的列表,允许添加新用户等。此活动使用DatabaseAdapter读取/写入数据库。
  3. 问题是:我是否应该处理数据库访问的异常,例如在添加新记录时(假设记录应该始终正确添加)?我应该尝试捕获DatabaseAdapter中的异常并将其添加到日志中吗?或者也许我根本不应该抓住它?

2 个答案:

答案 0 :(得分:4)

大多数情况下,查询数据库时的异常是“开发时间”错误的结果,例如格式错误的查询,或修改模式但不增加数据库版本,或类似的东西。这些将很容易在现场找到并修复,因此您的最终用户不会受到这些类型的错误的影响。

但是,在下列情况下,您可能也有例外情况:

  • 您尝试从多个进程(灾难处方)访问您的SQLite数据库。
  • 用户的设备上的磁盘空间不足。
  • 由于未正确转出用户输入,您的查询格式错误。
  • 您的onUpgrade()方法中存在错误或类似错误。
  • 您正在使用参照完整性(可能在SQLite 3.6.19及更高版本中),并且某些表约束失败。

实际上,这些场景没有通用答案。对于最终用户来说,显示简单错误比让应用程序强制关闭要好得多。

我的经验法则是不惜一切代价避免数据库损坏。我宁愿抛出RuntimeException并立即杀死应用程序,而不是让它默默地做错事。此外,我宁愿显示一条消息,说明无法完成插入而不是强行关闭应用程序。

答案 1 :(得分:0)

对于这个始终适合的问题,没有共同的答案。这取决于用例。虽然两个规则总是适用:不要将过于详细的异常消息传递给上面的层(UI不需要知道SQL语法中的问题)并处理有意义的异常(不要在DB类中显示错误对话框)。例如,您可以在数据库类中捕获数据库异常,记录它,然后重新抛出一个自定义的CustomerNotFoundException,它会在UI中捕获,您可以在其中显示错误对话框。