首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ContactsContract:更新RawContact忽略display_name

ContactsContract:更新RawContact忽略display_name
EN

Stack Overflow用户
提问于 2017-03-19 22:44:52
回答 1查看 161关注 0票数 0

在更新RawContactContactsContract.Data StructuredName行时,我的代码使用用户提供的值设置DISPLAY_NAME列。它还用用户提供的值更新第一、中间、最后的值。

当从ContactsContract.Contacts取回联系人DISPLAY_NAME时,提供给RawContact的显示名称被忽略,取而代之的是,安卓基于StructuredName名称部分构建了一个显示名称。

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

例如,假设将以下内容写入StructuredName行:

代码语言:javascript
复制
DISPLAY_NAME: F L
GIVEN_NAME: F
MIDDLE_NAME: X
LAST_NAME: L

在本例中,我希望聚合联系人显示名称为"F L“。但是,它将是"F X L“。

下面是编写StructureName行的代码,其中设置给每一列的值都是成员变量:

代码语言:javascript
复制
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());
}

下面是执行“ops”的代码:

代码语言:javascript
复制
  ContentResolver resolver = context.getContentResolver();
  ContentProviderResult[] results = resolver.applyBatch(ContactsContract.AUTHORITY, ops);

下面是获取聚合联系人显示名称的代码:

代码语言:javascript
复制
public static ContactData fetchContact (Cursor cursor)
{
  String name = cursor.getString (cursor.getColumnIndex (ContactsContract.Contacts.DISPLAY_NAME_PRIMARY));
  ... do something with the feteched data ...
}

如果Android忽略了用户提供的显示名称,那么该列的意义何在?

EN

回答 1

Stack Overflow用户

发布于 2017-03-20 18:42:00

如果你看一下DISPLAY_NAME的文档,它会说:

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

这意味着每当您更新DISPLAY_NAME时,它都会更新名称部分(GIVEN_NAME等),而每当您更新其中一个部分时,它就会更新DISPLAY_NAME,因此名称部分和DISPLAY_NAME始终是一致的。

我猜他们这样做是为了避免出现这样的问题,比如用户将错误的名称设置为电话号码,从"John Doe“到"Bob Dylan",但是名称部分没有更新,所以它们仍然使用"John”和"Doe",这显然是一种不受欢迎的情况。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42887911

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档