更新联系人导致写入错误的值

Oce*_*lue 0 android

我正在尝试显示联系人的姓名,电话号码和电子邮件,并让用户更新任何值.出于某种原因,当我的代码执行时,电子邮件的值会在所有三个字段上被覆盖.这里的逻辑必须有一个小故障,但我无法弄明白.

这是我更新Contacts URI的方法.

private void updateContact() {
    ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
    ops.add(ContentProviderOperation.newUpdate(ContactsContract.RawContacts.CONTENT_URI)
            .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, name)
            .build());
    ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
            .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, name)
            .withValue(ContactsContract.Data.MIMETYPE,
                        ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
            .build());
    ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
            .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phoneNumber)
            .withValue(ContactsContract.Data.MIMETYPE, 
                    ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
            .build());
    ops.add(ContentProviderOperation.newUpdate(ContactsContract.Data.CONTENT_URI)
            .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
            .withValue(ContactsContract.Data.MIMETYPE,
                            ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE)
            .withValue(ContactsContract.CommonDataKinds.Email.DATA, email)
            .build());

    try {
        getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
        // Display update
        Context ctx = getApplicationContext();
        CharSequence txt = "Contact Updated";
        int duration = Toast.LENGTH_SHORT;
        Toast toast = Toast.makeText(ctx, txt, duration);
        toast.show();

    } catch (Exception e) {
        // Display warning
        Context ctx = getApplicationContext();
        CharSequence txt = "Update Failed";
        int duration = Toast.LENGTH_SHORT;
        Toast toast = Toast.makeText(ctx, txt, duration);
        toast.show();

    }
}
Run Code Online (Sandbox Code Playgroud)

小智 7

看到这个链接:

http://comments.gmane.org/gmane.comp.handhelds.android.devel/92848

"你不应该在update语句中指定mime类型 - 它不可更新."

"您的查询说:"更新此联系人的所有数据行,将其中一个字段设置为"John",将另一个字段设置为"Abraham".数据行包括电话号码,电子邮件,照片,您的名字.您需要做的是找到要更新的特定数据行,然后在选择中使用其_id(或者更常见的是在URI本身中)."

"联系人的数据结构基于三个独立的表:联系人,RawContacts和数据.联系人可以有多个RawContacts,可以有多个数据行.每个数据行都有一个mime类型,指定存储在哪个数据类型联系人姓名存储在mime类型为StructuredName.CONTENT_TYPE的行中.

因此,为了更改联系人名称,首先需要找到包含该名称的数据行,然后更新该数据行.提供者将负责其余的工作(例如,将名称提升到RawContact级别,然后再联系)."