如何处理" SQLiteException:null"来自ContentResolver.applyBatch?

时间:2015-09-26 02:26:16

标签: android android-contacts samsung-mobile android-syncadapter

我已经实现了一个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 个答案:

答案 0 :(得分:0)

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

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

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

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