无法使用新字段更新联系人
Posted
技术标签:
【中文标题】无法使用新字段更新联系人【英文标题】:Cannot update contact with new fields 【发布时间】:2012-02-23 11:09:18 【问题描述】:我在尝试使用不存在的字段更新现有联系人时遇到问题。 例子: 我成功创建了包含姓名和电子邮件地址字段的新联系人。在创建操作期间,我仅将 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());
如果在创建联系人期间插入了电话字段,则更新工作正常。如果没有插入电话,则 update 不会执行任何操作 - 该字段将不会被更新。 LogCat 中没有警告也没有错误。
我不想在创建联系人时创建空字段的原因是,当我切换到 com.android.contacts.list.ContactListItemView 中出现空指针异常的联系人选项卡时,三星 Nexus 设备中的电话应用程序会崩溃。 onMeasure(ContactListItemView.java:350)。
所以,我的问题是: 如果不存在,如何在更新过程中插入一个新字段(以及如何检测它)或者如果存在但新的更新值为空则删除该字段?如果字段为空,是否有可能或有另一种解决方案来避免 Nexus 手机应用程序崩溃?
附:尝试为已创建的联系人运行 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)
【问题讨论】:
【参考方案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());
【讨论】:
以上是关于无法使用新字段更新联系人的主要内容,如果未能解决你的问题,请参考以下文章
在vCenter上更新证书后,Delivery Controller无法联系vCenter Server
在 MFC 中使用 MAPI API 创建和更新联系人期间,Outlook 没有正确显示联系人字段?
您输入的帐户无法识别。请与Team Foundation Server管理员联系以添加您的帐户