无法使用新字段更新联系人

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管理员联系以添加您的帐户

hive表新增字段后,新字段无法写入的问题 -- cascade

无法通过 JS 更新隐藏字段

无法刷新 s-s-rs 报告中的数据字段