【问题标题】:How to handle SQLiteException in Android activity?如何处理 Android 活动中的 SQLiteException?
【发布时间】:2012-11-04 14:20:28
【问题描述】:

我正在研究如何在 Android 中处理异常。

在记事本内容提供程序的示例代码中的update() 函数中,它调用getWriteableDatabase(),这可能会引发SQLiteException

我注意到NoteEditor Activity saveNote() 函数有以下代码:

// Commit all of our changes to persistent storage. When the update completes
// the content provider will notify the cursor of the change, which will
// cause the UI to be updated.
try {
   getContentResolver().update(mUri, values, null, null);
 } catch (NullPointerException e) {
     Log.e(TAG, e.getMessage());
 }

如果出现SQLiteException 会怎样?我希望能够在Activity 中捕获此异常并向用户显示适当的消息(通过吐司或类似的东西)。

我想我可以通过为SQLiteException 添加一个额外的捕获来做到这一点。但是,我在 Google 文档中阅读了以下信息:

“请记住,Android 系统必须能够跨进程边界传递异常。Android 可以针对以下可能对处理查询错误有用的异常执行此操作:

IllegalArgumentException(如果您的提供者收到 >invalid content URI,您可以选择抛出此异常)

NullPointerException"

所以我现在很困惑——我能不能赶上SQLiteException

【问题讨论】:

  • 记事本示例是否甚至在不同的进程中使用了提供程序?如果没有,任何异常都可以直接捕获。
  • 可能不是,但我仍然想找出这个问题的答案 - 假设我有另一个独立于记事本的服务进行更新(例如,将我的记事本条目与云同步)?
  • 嗯,我现在很困惑——我刚读到这个“默认情况下,同一个应用程序的所有组件都在同一个进程中运行,大多数应用程序不应该改变这一点”。所以,即使我写了一个服务,它也在同一个进程中,所以我可以捕捉到异常?或许这主要适用于您向其他应用程序开放提供程序的情况?
  • 是的,在您自己的应用程序中使用ContentProvider 通常是直接连接(除非您在清单中设置android:process)。如果您将您的提供程序暴露给其他应用程序,或者您使用其他应用程序的提供程序(例如 Android 的联系人或媒体提供程序),则所有数据传输都必须使用 IPC,并且不可能直接传播异常。包括异常在内的所有数据都需要序列化并从一个进程传输到另一个进程。除了ContentProvider 之外,Service 也一样,具有要绑定的接口。

标签: android sqlite exception-handling android-activity android-contentprovider


【解决方案1】:

只要有可能,您应该在发生异常的类或组件中捕获异常。使用某种广播机制或返回值语义来报告跨进程的错误。

这无疑是一个棘手的情况。有人说,如果 ContentProvider 中出现 SQLite(或其他 Exception),提供者应该向上传播异常,而不是在 Cursor 中返回 null。但是,这通常不适用于跨进程!另一方面,返回 null 并不能提供很多信息。

一组有限的异常do traverse process boundaries,但 SQLiteException 不在其中——它们仍然可能有用/合适。

【讨论】:

    猜你喜欢
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多