我可以更新这样的电话号码:
ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI)
.withSelection("_id =?", new String[] { id })
.withValue(Phone.NUMBER, "5555555555").build());
getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);
但是在我更新displayname的地方,它不起作用:
ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI)
.withSelection("_id=?", new String[] { id })
.withValue("display_name", "jack").build());
这不是一个字:
context.getContentResolver().update(
ContactsContract.Data.CONTENT_URI,
values,
ContactsContract.CommonDataKinds.StructuredName._ID + "="
+ id
+ " and mimetype='vnd.android.cursor.item/name'",
null);
答案 0 :(得分:2)
display_name是只读的。
任何想要与联系人提供商进行详细工作的人都应该明确阅读联系人提供商API指南,并按照联系人提供商Android培训进行操作。联系人提供程序是一个包含许多规则的复杂数据库系统,除非您了解提供程序的基本布局,否则您将遇到令人沮丧的问题。
CommonDataKinds.StructuredName.DISPLAY_NAME和CommonDataKinds.Phone.NUMBER都设置为data1,因为实际上它们并不引用单独的表。相反,它们都引用ContactContracts.Data中的DATA1列。 联系人的所有详细数据都存储在ContactContracts.Data中,无论它是什么。例如,联系人的所有电话号码和所有电子邮件地址都存储在ContactContracts.Data中。将一种类型的行告诉另一种类型的方式是通过行的MIMETYPE值。文档详细解释了这一点。
另一个提示:您应该避免在自己的代码中对联系人提供程序进行添加,删除或更新。相反,发送启动设备的联系人应用程序的Intent或允许用户选择要使用的联系人应用程序。这允许用户在联系人应用程序而不是您的应用程序中完成工作。这也在文档中描述。