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

5
我的问题是关于DB异常处理的良好实践。
假设我有一个在DB中存储数据的应用程序。已经实现了以下层:
1. DatabaseAdapter-处理SQL查询并以模型的形式向更高层提供数据。适配器包含以下方法: - List getAllUsers() - void addUser(UserModel user)
2. UserListActivity-显示所有用户的列表,允许添加新用户等。此活动使用DatabaseAdapter读/写数据库。
问题是:当添加新记录时(假设记录应始终正确添加),我是否应处理数据库访问异常?我只需在DatabaseAdapter中尝试捕获异常并将其添加到日志中吗?或者也许我根本不应该捕获它?
2个回答

4
大多数情况下,查询数据库时出现异常是“开发时间”错误的结果,例如格式不正确的查询或修改模式但未增加数据库版本等。这些错误很容易在现场找到并修复,因此您的最终用户不会受到这些类型错误的影响。
然而,在以下情况下也可能出现异常:
- 从多个进程尝试访问SQLite数据库(灾难性后果)。 - 用户设备上的磁盘空间不足。 - 由于未正确转义用户输入而导致查询格式不正确。 - 在您的onUpgrade()方法中存在错误或类似情况。 - 您正在使用引用完整性(在SQLite 3.6.19及更高版本中可能),并且某些表约束失败。
实际上,对于这些情况,没有通用的答案。对于最终用户来说,显示一个简单的错误消息比让您的应用程序强制关闭要好得多。
我的经验法则是不惜一切代价避免损坏您的数据库。我宁愿抛出RuntimeException并立即关闭应用程序,而不是让它悄无声息地做错事情。此外,我宁愿显示消息,说明插入无法完成,而不是强制关闭应用程序。

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接