ContactsContract:update RawContact忽略display_name

时间:2017-03-19 14:44:52

标签: android contactscontract

更新ContactsContract.Data的{​​{1}} StructuredName行时,我的代码会将RawContact列设置为用户提供的值。它还使用用户提供的值更新第一个,中间的,最后一个。

DISPLAY_NAME取回联系人DISPLAY_NAME时,会忽略提供给ContactsContract.Contacts的显示名称,而Android会根据RawContact名称制作一个名称部分。

有没有办法告诉StructuredName使用提供的显示名称?

例如,请考虑将以下内容写入ContactsContract行:

StructuredName

在这种情况下,我希望聚合联系人显示名称为“F L”。但是,它将是“F X L”。

以下是编写StructureName行的代码,其中为每列设置的值是成员变量:

DISPLAY_NAME: F L
GIVEN_NAME: F
MIDDLE_NAME: X
LAST_NAME: L

这是执行“ops”的代码:

protected void prepareUpdate (ArrayList<ContentProviderOperation> ops)
{
  String where = ContactsContract.Data._ID + " = " + dataId;

  ContentProviderOperation.Builder builder;
  builder = ContentProviderOperation.newUpdate (ContactsContract.Data.CONTENT_URI);
  builder.withSelection (where, null);
  builder.withValue (ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE);
  builder.withValue (ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, displayName);
  builder.withValue (ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, givenName);
  builder.withValue (ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, familyName);
  builder.withValue (ContactsContract.CommonDataKinds.StructuredName.PREFIX, prefix);
  builder.withValue (ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME, middleName);
  builder.withValue (ContactsContract.CommonDataKinds.StructuredName.SUFFIX, suffix);
  builder.withValue (ContactsContract.CommonDataKinds.StructuredName.PHONETIC_FAMILY_NAME, phoneticFamilyName);
  builder.withValue (ContactsContract.CommonDataKinds.StructuredName.PHONETIC_MIDDLE_NAME, phoneticMiddleName);
  builder.withValue (ContactsContract.CommonDataKinds.StructuredName.PHONETIC_GIVEN_NAME, phoneticGivenName);

  ops.add (builder.build());
}

而且,这是获取聚合联系人显示名称的代码:

  ContentResolver resolver = context.getContentResolver();
  ContentProviderResult[] results = resolver.applyBatch(ContactsContract.AUTHORITY, ops);

如果Android忽略了用户提供的显示名称,该列的重点是什么?

1 个答案:

答案 0 :(得分:0)

如果您查看DISPLAY_NAME的文档,则会说:

  

应该用于显示联系人的名称。非结构化   名称的组件应与其结构化一致   表示

这意味着每当您更新DISPLAY_NAME时,它都会更新名称部分(GIVEN_NAME等),每当您更新其中一个部分时,它都会更新DISPLAY_NAME,所以在任何时候,名称部分和DISPLAY_NAME都是一致的。

我猜他们是这样做的,以避免用户修复设置为“John Doe”到“Bob Dylan”的电话号码的错误名称等问题,但名称部分不是已更新为“John”和“Doe”,这显然是一种不受欢迎的情况。