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