无法更新与新字段的联系

时间:2012-02-23 11:09:18

标签: android

尝试使用不存在的字段更新现有联系时出现问题。 例: 我成功创建了包含姓名和电子邮件地址字段的新联系人。在创建操作期间,我仅对非空的字段使用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)

1 个答案:

答案 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());
    }
}