HarmonyOS 鸿蒙Next通讯录相关问题

HarmonyOS 鸿蒙Next通讯录相关问题

  1. 请问如何批量插入联系人到系统通讯录呢?目前我通过这个addContact() 这个 API 一个个插入,但是有大量联系人的时候,这个 API 反应很慢,需要很长的时间才能插入完毕

  2. 如何获取联系人数量?

业务需要想获取联系人数目,但是好像没有没有提供相关的 api,只能通过获取所有的联系人来计算数量,这样的效率很低,也很浪费资源

  1. 如何区分联系人是否有名字?

我通过addContact()添加了一个无名字的联系人,从系统的通讯录看这个人也确实没有名字,但是通过queryContacts() 这个方法获取的联系人,是有名字的:

{"name":{"fullName":"350802xxxx5516","familyNamePhonetic":"","middleName":"","namePrefix":"350802xxxx5516","nameSuffix":""},"phoneNumbers":[{"phoneNumber":"350802xxxx5516","labelName":"","labelId":2}],"postalAddresses":[{"postalAddress":"住址福建省龙岩市城东宝路","labelName":"","labelId":1},{"postalAddress":"公民身份号码","labelName":"","labelId":1}],"key":"42380","id":42380}

另外我注意到如果我手动新建一个没有名字的联系人,它也会自带姓名。但是我注意到我写入的部分数据,通讯录会显示(无姓名) 分组


更多关于HarmonyOS 鸿蒙Next通讯录相关问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复

**目前Contacts Kit没有提供批量插入联系人的API,**楼主可以试试将多个addContact调用封装为Promise,使用Promise.all进行并发处理。每次插入的Contact对象仅包含必要字段,减少冗余数据处理。添加加载动画,避免用户误操作另外可以通过日志监控耗时节点。

async function batchAddContacts(context: Context, contacts: Contact[]) {
  const promises = contacts.map(contact => {
    return contact.addContact(context, contact);
  });
  await Promise.all(promises);
}

获取联系人数量

楼主可通过queryContacts接口的过滤条件与分页机制优化:

import { contact } from '@kit.ContactsKit';

contact.queryContacts(
  {  
    // 空条件表示查询全部
    pageIndex: 0,
    pageSize: 0, // 仅返回总数,非所有数据
    fields: ['id'] // 仅查询ID字段减少数据量
  },
  (err: BusinessError, data) => {
    console.info(`Total contacts: ${data.totalCount}`);
  }
);

判断无姓名联系人

系统会将电话号码等字段自动填充到fullName,可以先检查name子字段是否全为空:

function isAnonymous(contact: Contact): boolean {
  const name = contact.name;
  return (
    !name.givenName &&  
    !name.middleName &&  
    !name.familyName &&
    name.fullName === name.phoneNumber // 这里假设fullName由系统自动填充
  );
}

插入时添加扩展字段比如isAnonymous: true,查询时通过extension字段判断

更多关于HarmonyOS 鸿蒙Next通讯录相关问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


目前 OpenHarmony 暂无原生批量插入 API,但可通过异步并发控制事务优化提升效率

  1. 暂未提供原生批量插入接口,需通过addContact()逐个添加

当前addContact()接口单次调用耗时约50-100ms(实测数据),千级联系人批量插入建议在Worker线程执行

若需超大规模数据同步(万级以上),建议调用系统通讯录的导入功能或使用DataShare实现跨应用数据共享

鸿蒙Next通讯录基于分布式技术实现跨设备同步,使用DataAbility提供数据访问接口。通讯录数据存储在轻量级偏好数据库Preferences DB中,支持联系人增删改查操作。开发者可通过Contact模块的JS API调用通讯录功能,包括联系人查询(contact.query)、添加(contact.add)等。权限需配置ohos.permission.READ_CONTACTS和ohos.permission.WRITE_CONTACTS。跨设备同步依赖SuperDevice能力自动完成。

关于HarmonyOS Next通讯录开发的问题

1. 批量插入联系人问题

目前官方API确实只提供了addContact()单个插入方法。对于大批量操作,建议:

  • 使用异步方式插入,避免阻塞主线程
  • 可以考虑分批处理,比如每100个联系人做一次短暂延迟
  • 检查是否开启了过多的回调监听

2. 获取联系人数量问题

确实没有直接获取数量的API。优化建议:

  • 使用queryContacts()时设置limit为1,只获取元数据
  • 考虑缓存联系人数量,定期更新
  • 使用分页查询时记录总数

3. 联系人姓名问题

系统会自动为无姓名联系人生成显示名:

  • 检查name.fullName是否为空字符串
  • 系统会将电话号码等字段作为fallback显示名
  • 无姓名联系人在UI上会显示为"(无姓名)"分组

建议处理逻辑:

  1. 检查name对象是否存在
  2. 检查fullName是否为空字符串
  3. 检查是否所有姓名相关字段都为空

这些是目前HarmonyOS通讯录API的限制和可行解决方案。

回到顶部