我想从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 ...
答案 0 :(得分:1)
自{5级}以来ContactsContract API已经可用。报告此问题的用户是否可以&lt; 5级(甜甜圈,蛋糕)?
答案 1 :(得分:1)
设备制造商可以更改AOSP附带的ContentProvider
的实施。理论上,这些更改将由兼容性测试套件(CTS)捕获,因此只有不破坏API的设备才会在通过Play商店发布时运行您的应用。
有人说......
因此,当您看到似乎来自操作系统提供的ContentProvider
内的问题,但这些问题很少发生和/或在无法识别的设备上时,请不要惊慌。在这种情况下,您仍然可能选择以某种方式优雅地失败(通过将失败的调用包装在您自己的异常处理程序中),但您的代码不太可能是困难的来源。