如何处理来自 ContentResolver.applyBatch 的“SQLiteException:null”?

Posted

技术标签:

【中文标题】如何处理来自 ContentResolver.applyBatch 的“SQLiteException:null”?【英文标题】:How to handle "SQLiteException: null" from ContentResolver.applyBatch? 【发布时间】:2015-12-23 22:12:54 【问题描述】:

我已经实现了一个 SyncAdapter,它将数据写入 android Contacts Provider。大多数情况下,这似乎工作正常,除了我的一小部分用户,他们每次 SyncAdapter 触发时都会看到应用程序崩溃!当我从这些设备(主要是运行 Android 5+ 的三星设备)恢复日志时,我看到的是:

exception: android.database.sqlite.SQLiteException: null
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:181)
at android.database.DatabaseUtils.readExceptionWithOperationApplicationExceptionFromParcel(DatabaseUtils.java:160)
at android.content.ContentProviderProxy.applyBatch(ContentProviderNative.java:520)
at android.content.ContentProviderClient.applyBatch(ContentProviderClient.java:402)
at android.content.ContentResolver.applyBatch(ContentResolver.java:1297)

现在,ContentProviderProxy.applyBatch 似乎通过将其数据捆绑到一条消息中来工作,该消息通过 IBinder 发送到负责管理联系人数据库的任何服务。反过来,它会收到一条消息,然后将其传递给DatabaseUtils.readExceptionWithOperationApplicationExceptionFromParcel。此函数检查回复,并根据传递的代码,应该在回复中抛出带有String 消息的异常。不幸的是,在这种情况下,虽然服务在回复中设置了代码,但没有设置消息;这就是为什么我看到 SQLiteException: null 并且我不知道自己做错了什么。

是否还有其他人遇到此错误,如果有,您能帮我缩小在这种情况下发生的情况吗?谢谢!

【问题讨论】:

【参考方案1】:

我遇到了。它是由联系人数据库损坏引起的。完整的详细信息是on my post to the Samsung Developers forum。

我发现的唯一解决方法是在同步方法中捕获 SQLiteException,然后通知用户他必须清除联系人数据库(他可能会丢失本地联系人!)。意图是:

Intent detailsIntent = new Intent(android.provider.Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
detailsIntent.setData(Uri.parse("package:com.android.providers.contacts"));

清除数据后,联系人将重新同步,数据库将正确重建。

【讨论】:

这也与我的应用程序的行为一致,并且解决方法似乎可以清除它。在确定之前,我想再进行一些测试,但在这一点上,我相信这是正确的答案。当我更有信心时,我会这样标记。谢谢!

以上是关于如何处理来自 ContentResolver.applyBatch 的“SQLiteException:null”?的主要内容,如果未能解决你的问题,请参考以下文章

Android/Parse-如何处理来自 ParseQuery 的多个回调

Core Data + iCloud 如何处理来自云端的数据更新

如何处理来自显示视频的网页的响应流?

如何处理来自 API 调用的 ios 数据

你如何处理来自 AJAX 调用的错误?

如何处理来自 XMLHttpRequest 的八位字节流