尝试使用不存在的字段更新现有联系时出现问题。 例: 我成功创建了包含姓名和电子邮件地址字段的新联系人。在创建操作期间,我仅对非空的字段使用ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)。
在联系人创建期间插入电话字段的代码(工作正常):
if (isNewContact){
if (!phone.equals("")){
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, id)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phone)
.withValue(ContactsContract.CommonDataKinds.Phone.TYPE, type)
.build());
}
}
所以,现在我尝试运行更新过程并将联系电话号码附加到我的联系人:
if (isUpdateContact){
ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
.withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND "
+ ContactsContract.CommonDataKinds.Phone.TYPE
+ "=? AND " + ContactsContract.Data.MIMETYPE
+ "=?",
new String[] {"" + id, "" + type,
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE })
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phone)
.withValue(ContactsContract.CommonDataKinds.Phone.TYPE, type)
.build());
}
如果在联系人创建期间插入了电话字段,则更新正常。如果未插入电话,则更新不执行任何操作 - 该字段将不会更新。在LogCat中没有警告没有警告。
我不想在联系人创建时创建空字段的原因是当我切换到com.android.contacts.list.ContactListItemView中具有空指针异常的联系人选项卡时,空字段崩溃了Samsung Nexus设备中的电话应用程序。 onMeasure(ContactListItemView.java:350)。
所以,我的问题是: 在更新过程中如何插入新字段(如果不存在)(以及如何检测它)或删除字段(如果存在但新的更新值为空)?是否有可能或者有其他解决方案可以避免Nexus手机应用程序崩溃,如果字段为空?
P.S。尝试在已创建的联系人期间运行newInsert,获取:
mType: 1, mUri: content://com.android.contacts/data, mSelection: null, mExpectedCount: null, mYieldAllowed: false, mValues: data1= mimetype=vnd.android.cursor.item/phone_v2 data2=1, mValuesBackReferences: raw_contact_id=2962, mSelectionArgsBackReferences: null
java.lang.ArrayIndexOutOfBoundsException: asked for back ref 2962 but there are only 1 back refs
at android.content.ContentProviderOperation.backRefToValue(ContentProviderOperation.java:362)
答案 0 :(得分:1)
好的,我找到了修复: (这将执行正确的更新操作 - 如果未找到,则创建;如果新值为空,只需删除该字段;如果存在,则执行更新。)
if (isUpdateContact){
ops.add(ContentProviderOperation.newDelete(ContactsContract.Data.CONTENT_URI)
.withSelection(ContactsContract.Data.RAW_CONTACT_ID + "=? AND "
+ ContactsContract.CommonDataKinds.Phone.TYPE
+ "=? AND " + ContactsContract.Data.MIMETYPE
+ "=?",
new String[] {"" + id, "" + type,
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE })
.build());
if (!phone.equals("")){
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValue(ContactsContract.Data.RAW_CONTACT_ID, id)
.withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phone)
.withValue(ContactsContract.CommonDataKinds.Phone.TYPE, type)
.build());
}
}