0

我可以像这样更新电话号码:

 ops.add(ContentProviderOperation.newUpdate(Data.CONTENT_URI)
         .withSelection("_id =?", new String[] { id })
         .withValue(Phone.NUMBER, "5555555555").build());

         getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);

但是在我更新显示名称的地方,它不起作用:

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);
4

1 回答 1

2

display_name 是只读的。

任何想要使用 Contacts Provider 进行详细工作的人都应该阅读Contacts Provider API 指南并遵循 Contacts Provider Android 培训。联系人提供程序是一个复杂的数据库系统,有许多规则,除非您了解提供程序的基本布局,否则您会遇到令人沮丧的问题。

CommonDataKinds.StructuredName.DISPLAY_NAME 和 CommonDataKinds.Phone.NUMBER 都设置为 data1,因为实际上它们并不引用单独的表。相反,它们都引用 ContactContracts.Data 中的 DATA1 列。联系人的所有详细数据都存储在 ContactContracts.Data 中,无论它是什么。例如,联系人的所有电话号码和所有电子邮件地址都存储在 ContactContracts.Data 中。区分一种类型的行与另一种类型的方法是通过该行的 MIMETYPE 值。文档对此进行了详细说明。

另一个提示:您应该避免在自己的代码中对联系人提供程序进行添加、删除或更新。相反,发送一个启动设备的联系人应用程序或允许用户选择要使用的联系人应用程序的 Intent。这允许用户在联系人应用程序而不是您的应用程序中完成工作。这也在文档中进行了描述。

于 2013-04-24T02:51:02.040 回答