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

时间:2010-06-03 23:11:12

标签: android

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

这是我更新联系人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();

    }
}

2 个答案:

答案 0 :(得分: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级别,然后再联系)。“

答案 1 :(得分:0)

另见

http://www.eoeandroid.com/sdk/api/reference/android/provider/ContactsContract.Data.html

必须先获取dataId:

ArrayList ops = Lists.newArrayList();  ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI)           .withSelection(Data._ID +“=?”,new String [] {String.valueOf(dataId)})           .withValue(Email.DATA,“somebody@android.com”)           。建立());  getContentResolver()。applyBatch(ContactsContract.AUTHORITY,ops);