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