&引用;SQLiteException:没有这样的列:mimetype";在Android中使用ContactsContract时

&引用;SQLiteException:没有这样的列:mimetype";在Android中使用ContactsContract时,android,android-contentprovider,android-contacts,sqlexception,android-contentresolver,Android,Android Contentprovider,Android Contacts,Sqlexception,Android Contentresolver,我想从Android的内部数据库表contacts contract中删除一个条目,即应该从联系人的条目中删除生日等事件 下面的代码运行得很好,但是一些用户(约1%)会因为SQLException而崩溃。那么,我的代码中是否有任何错误,或者只是他们的设备不支持Android的联系人contract正确 try { ArrayList<Long> rawContactIDs = getRawContactID(o.getID()); int rawContactCoun

我想从Android的内部数据库表
contacts contract
中删除一个条目,即应该从联系人的条目中删除生日等事件

下面的代码运行得很好,但是一些用户(约1%)会因为
SQLException
而崩溃。那么,我的代码中是否有任何错误,或者只是他们的设备不支持Android的
联系人contract
正确

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) {}

从第5级开始,该功能就可用。报告此问题的用户是否可能是设备制造商可以更改AOSP附带的
ContentProvider
的实现。理论上,兼容性测试套件(CTS)将捕获这些更改,因此只有不破坏API的设备在通过Play Store发货时才能运行您的应用程序

话虽如此

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

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

有没有出现这种异常的设备模式?在一个特定的情况下,它是一个
更亮的/HW-T18
。如果你没有从主流设备上看到这一点(我个人从未听说过),我会把它归为乱七八糟的设备。@commonware如果你把它作为答案,我可以接受;)因为这可能是导致问题的原因…不,因为该应用程序仅对API级别>=8的用户可用。非常感谢,这很可能是原因!
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 ...