【问题标题】:"SQLiteException: no such column: mimetype" when using ContactsContract in Android在 Android 中使用 ContactsContract 时出现“SQLiteException:没有这样的列:mimetype”
【发布时间】:2012-08-23 17:19:46
【问题描述】:

我想从 Android 的内部数据库表 ContactsContract 中删除一个条目,即应该从联系人的条目中删除诸如生日之类的事件。

以下代码运行良好,但一些用户(约 1%)遇到此问题并出现 SQLException 崩溃。那么我的代码有什么问题,还是他们的设备不正确支持 Android 的 ContactsContract

try {
    ArrayList<Long> rawContactIDs = getRawContactID(o.getID());
    int rawContactCount = rawContactIDs.size();
    for (int r = 0; r < rawContactCount; r++) {
        long rawContactID = rawContactIDs.get(r);
        String where = ContactsContract.Data.MIMETYPE+" = ? AND "+ContactsContract.Data.RAW_CONTACT_ID+" = ? AND "+ContactsContract.CommonDataKinds.Event.TYPE+" = ?";
        String[] selection = new String[] { ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE, String.valueOf(MY_RAW_CONTACT_ID), String.valueOf(ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY) };
        getContentResolver().delete(ContactsContract.Data.CONTENT_URI, where, selection);
    }
}
catch (Exception e) {}

抛出的异常是:

android.database.sqlite.SQLiteException: no such column: mimetype: , while
compiling: DELETE FROM data WHERE mimetype = ? AND raw_contact_id = ? AND
data2 = ?
at
android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:158)
at
android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:114)
at
android.content.ContentProviderProxy.delete(ContentProviderNative.java:472)
at android.content.ContentResolver.delete(ContentResolver.java:700)
at ... MY_ACTIVITY ...

【问题讨论】:

  • 设备抛出此异常的任何模式?
  • 在一个特定情况下是brighter / HW-T18
  • 如果你没有从主流设备上看到这个(我个人从未听说过那个),我会把它归咎于混乱的设备。
  • @CommonsWare 如果您将此作为答案,我可以接受;)因为这可能是导致问题的原因...

标签: android android-contentprovider android-contacts sqlexception android-contentresolver


【解决方案1】:

设备制造商可以更改 AOSP 随附的 ContentProvider 的实现。理论上,兼容性测试套件 (CTS) 会捕获这些更改,因此只有不破坏 API 的设备才能在通过 Play 商店交付时运行您的应用。

话虽这么说......

  • CTS 远未完成
  • 如果您故意将您的应用分发到 Play 商店之外,并且有人使用不兼容的设备运行您的应用,则 CTS 不会保护您
  • 如果您无意将您的应用分发到 Play 商店之外(即您的应用已被盗版),并且有人使用不兼容的设备运行您的应用,则 CTS 不会保护您
  • 各种设备制造商盗版 Play 商店应用程序本身

因此,当您发现问题似乎源自操作系统提供的ContentProvider,但这些问题并不常见和/或出现在无法识别的设备上时,请不要惊慌。在这种情况下,您仍然可以选择以某种方式优雅地失败(通过将失败的调用包装在您自己的异常处理程序中),但您的代码不太可能真的是问题的根源。

【讨论】:

  • 非常感谢,很有可能是这个原因!
【解决方案2】:

ContactsContract API 从第 5 级开始可用。报告此问题的用户是否可能是

【讨论】:

  • 否,因为该应用仅适用于 API 级别 >= 8 的用户。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多