站在2025年末回望,今年是我在鸿蒙生态技术领域的突破之年。从HarmonyOS5.0到6.0的跨越,不仅见证了鸿蒙系统的成熟,也记录了我从应用开发者到鸿蒙即可的成长。这一年,我主导了2个企业级鸿蒙项目,和1个开源组件的开发,并在技术社区贡献了150+篇高质量技术文章其中包含基础教程文章,也有一些自己解决实际开发问题的记录。
img
每一个版本都是一个坚实的脚印

同应用跨设备数据同步

使用鸿蒙自由流转能力时,在某些业务场景下我们需要互相同步数据,让用户感觉不到设备的切换。
在之前的单版本数据存储中,用户切换设备后,部分未同步到服务器由本地数据库做记录的设置无法进行跨设备同步,用户需要重新进行各种偏好设置,降低了用户体验。
并且这种数据我们是记录在键值数据库中,好在鸿蒙上提供了多设备协同数据库,可以实现多设备协同,进行端到端的同步。

过程

  • 首先需要在在配置文件中声明权限(ohos.permission.DISTRIBUTED_DATASYNC),并在应用首次启动的时候弹窗获取用户授权
    这里就不再赘述,可以查看向用户申请授权章节

  • 构造分布式数据库管理实例并创建数据库
    这里我们需要创建kvManagerConfig对象,随后创建分布式数据库管理器实例。

try {
  const kvManagerConfig: distributedKVStore.KVManagerConfig = {
    bundleName: 'com.huangyuanlove.distributed_manager',
    context: context
  }
  kvManager = distributedKVStore.createKVManager(kvManagerConfig);
  console.info('Succeeded in creating KVManager.');
  // 继续创建获取数据库
} catch (e) {
  let error = e as BusinessError;
  console.error(`Failed to create KVManager. Code:${error.code},message:${error.message}`);
}
  • 调用getKVStore()方法获取并得到指定类型的键值型数据库
    这里我们需要声明需要创建的分布式数据库ID描述(例如示例代码中的’storeId’)。之后创建分布式数据库,官方文档中是建议关闭自动端端同步功能(autoSync:false),方便后续对端端同步功能进行验证,需要端端同步时主动调用sync接口
let kvStore: distributedKVStore.SingleKVStore | undefined = undefined;
try {
  let child1 = new distributedKVStore.FieldNode('id');
  child1.type = distributedKVStore.ValueType.INTEGER;
  child1.nullable = false;
  child1.default = '1';
  let child2 = new distributedKVStore.FieldNode('name');
  child2.type = distributedKVStore.ValueType.STRING;
  child2.nullable = false;
  child2.default = 'zhangsan';

  let schema = new distributedKVStore.Schema();
  schema.root.appendChild(child1);
  schema.root.appendChild(child2);
  schema.indexes = ['$.id', '$.name'];
  // 0表示COMPATIBLE模式,1表示STRICT模式。
  schema.mode = 1;
  // 支持在检查Value时,跳过skip指定的字节数,且取值范围为[0,4M-2]。
  schema.skip = 0;

  const options: distributedKVStore.Options = {
    createIfMissing: true,
    encrypt: false,
    backup: false,
    autoSync: false,
    // kvStoreType不填时,默认创建多设备协同数据库
    // 多设备协同数据库:kvStoreType: distributedKVStore.KVStoreType.DEVICE_COLLABORATION,
    kvStoreType: distributedKVStore.KVStoreType.SINGLE_VERSION,
    // schema 可以不填,在需要使用schema功能时可以构造此参数,例如:使用谓词查询等。
    schema: schema,
    securityLevel: distributedKVStore.SecurityLevel.S3
  };
  kvManager.getKVStore<distributedKVStore.SingleKVStore>('storeId', options, (err, store: distributedKVStore.SingleKVStore) => {
    if (err) {
      console.error(`Failed to get KVStore: Code:${err.code},message:${err.message}`);
      return;
    }
    console.info('Succeeded in getting KVStore.');
    kvStore = store;
    if (kvStore !== undefined) {
        // 请确保获取到键值数据库实例后,再进行相关数据操作
        // 进行后续相关数据操作,包括数据的增、删、改、查、订阅数据变化等操作
        // ...
    }
  });
} catch (e) {
  let error = e as BusinessError;
  console.error(`An unexpected error occurred. Code:${error.code},message:${error.message}`);
}

上面的代码中直接使用的官方文档的示例代码做测试,大家可以自行修改

  • 订阅分布式数据变化,调用put、get接口改变和查询数据
try {
  kvStore.on('dataChange', distributedKVStore.SubscribeType.SUBSCRIBE_TYPE_ALL, (data) => {
    console.info(`dataChange callback call data: ${data}`);
  });
} catch (e) {
  let error = e as BusinessError;
  console.error(`An unexpected error occurred. code:${error.code},message:${error.message}`);
}
  • 调用put()方法将数据写入分布式数据库和调用get()方法查询分布式数据库数据
    准备工作已经做好,接下来我们就可以进行数据写入和查阅啦

写入,建议是加上 try catch

const KEY_TEST_STRING_ELEMENT = 'key_test_string';
// 如果未定义Schema则Value可以传其他符合要求的值。
const VALUE_TEST_STRING_ELEMENT = '{"id":0, "name":"lisi"}';
try {
  kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT, (err) => {
    if (err !== undefined) {
      console.error(`Failed to put data. Code:${err.code},message:${err.message}`);
      return;
    }
    console.info('Succeeded in putting data.');
  });
} catch (e) {
  let error = e as BusinessError;
  console.error(`An unexpected error occurred. Code:${error.code},message:${error.message}`);
}

查询

try {
  kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT, (err) => {
    if (err !== undefined) {
      console.error(`Failed to put data. Code:${err.code},message:${err.message}`);
      return;
    }
    console.info('Succeeded in putting data.');
    kvStore = kvStore as distributedKVStore.SingleKVStore;
    kvStore.get(KEY_TEST_STRING_ELEMENT, (err, data) => {
      if (err != undefined) {
        console.error(`Failed to get data. Code:${err.code},message:${err.message}`);
        return;
      }
      console.info(`Succeeded in getting data. Data:${data}`);
    });
  });
} catch (e) {
  let error = e as BusinessError;
  console.error(`Failed to get data. Code:${error.code},message:${error.message}`);
}


  • 同步数据到对端设备
    关键点在这里,
import { distributedDeviceManager } from '@kit.DistributedServiceKit';
 
let devManager: distributedDeviceManager.DeviceManager;
try {
  // create deviceManager
  devManager = distributedDeviceManager.createDeviceManager(context.applicationInfo.name);
  // deviceIds由deviceManager调用getAvailableDeviceListSync方法得到
  let deviceIds: string[] = [];
  if (devManager != null) {
    let devices = devManager.getAvailableDeviceListSync();
    for (let i = 0; i < devices.length; i++) {
      deviceIds[i] = devices[i].networkId as string;
    }
  }
  try {
    // 1000表示最大延迟时间为1000ms
    kvStore.sync(deviceIds, distributedKVStore.SyncMode.PUSH_ONLY, 1000);
  } catch (e) {
    let error = e as BusinessError;
    console.error(`An unexpected error occurred. Code:${error.code},message:${error.message}`);
  }

} catch (err) {
  let error = err as BusinessError;
  console.error("createDeviceManager errCode:" + error.code + ",errMessage:" + error.message);
}

这样我们就完成了同一组网环境下的设备进行数据端端同步

生态贡献

第一次进行鸿蒙生态的演讲还是在 4 月末的济南,
img
还记得当天上午还是晴空万里,但在下午将要开始的时候却开始下月了,但依旧挡不住参会嘉宾的热情。
最后一次应该是在北京的举行的鸿蒙极客沙龙(北京站),当时分享了鸿蒙xflutter进行跨平台的方法以及路由管理方案。

img

中间也有大大小小的线上直播、私享会等等。

最终有幸参加了11 月 30 日在东莞华为溪村园区举行的鸿蒙极客盛典,侥幸成为了首批认证的鸿蒙极客

img

这里也借机宣传一下自己的开源鸿蒙组件SimpleHtmlRender 和 DevEco 插件Json2ArkTS。希望大家能点点 star,提提 issue

除了这些分享之外,同时也在博客中持续输出
img
每一篇文章都是一次技术的探索

结语

2025年是鸿蒙生态蓬勃发展的关键一年,也是我个人技术生涯的重要里程碑。从“会用”到“精通”,从“开发功能”到“设计架构”,这一年的成长远超预期。

期待在2026年,不仅继续追随鸿蒙的脚步,更能为这个生态贡献自己的一份力量。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐