【问题标题】:Android: how should I handle DB access exceptions?Android:我应该如何处理数据库访问异常?
【发布时间】:2013-02-27 05:59:17
【问题描述】:

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

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

  1. DatabaseAdapter - 处理 SQL 查询并以模型的形式向更高层提供数据。适配器包含如下方法:
    • 列出 getAllUsers()
    • void addUser(UserModel 用户)
  2. UserListActivity - 显示所有用户的列表,允许添加新用户等。此活动使用 DatabaseAdapter 读取/写入数据库。

问题是:我是否应该处理数据库访问异常,例如在添加新记录时(假设应该始终正确添加记录)?我是否应该尝试在 DatabaseAdapter 中捕获异常并将其添加到日志中?或者我根本不应该抓住它?

【问题讨论】:

    标签: android database exception-handling


    【解决方案1】:

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

    但是,您也有可能在以下情况下遇到例外情况:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2011-11-19
        • 1970-01-01
        • 1970-01-01
        • 2021-04-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-16
        • 1970-01-01
        • 2011-09-21
        相关资源
        最近更新 更多