鸿蒙系统-同应用跨设备数据同步(分布式功能)

一. 场景介绍

跨设备数据同步功能(即分布式功能),指将数据同步到一个组网环境中的其他设备。常用于用户应用程序数据内容在可信认证的不同设备间,进行自由同步、修改和查询。

二. 跨设备同步访问控制机制

在进行开发之前,先要了解一下跨设备同步访问控制机制,数据跨设备同步时,数据管理基于设备等级和数据安全标签进行访问控制,具体如下:

设备安全级别 可同步的数据安全标签
SL1 S1
SL2 S1~S2
SL3 S2~S3
SL4 S3~S4
SL5 S4~S5

手表通常为低安全的SL1设备。若创建数据安全标签为S1的数据库,则此数据库数据可以在这些设备间同步;若创建的数据库标签为S2-S4,则不能在这些设备间同步。
总结:想要开设备同步,设备安全级别需要设置为:S1

具体设置代码:

javascript 复制代码
 const options: distributedKVStore.Options = {
    	//设置安全等级
      securityLevel: distributedKVStore.SecurityLevel.S1
    };

三.键值型数据库跨设备数据同步

1. 导入模块
javascript 复制代码
import { distributedKVStore } from '@kit.ArkData';
2. 申请权限

在module.json5中requestPermissions里面配置权限:

javascript 复制代码
  {
        "name": "ohos.permission.DISTRIBUTED_DATASYNC",
        "reason": "$string:write_permission",
        "usedScene": {
          "abilities": [
            "EntryAbility"
          ],
          "when": "always"
        }
      },
3. 创建kvManager对象
javascript 复制代码
  let config: distributedKVStore.KVManagerConfig = {
        bundleName: context.abilityInfo.bundleName,
        context: context
      };

   try {
        this.kvManager = distributedKVStore.createKVManager(config);
      } catch (error) {
        PhLog.error(`createKvStore createKVManager failed, err=${JSON.stringify(error)}`, 'KvStoreViewModel');
        reject(`createKvStore createKVManager failed, err=${JSON.stringify(error)}`);
        return;
      }
4. 获取并得到指定类型的键值型数据库
javascript 复制代码
    let options: distributedKVStore.Options = {
        createIfMissing: true,
        encrypt: false,
        backup: false,
        autoSync: true,//自动同步功能
        kvStoreType: distributedKVStore.KVStoreType.DEVICE_COLLABORATION,
        securityLevel: distributedKVStore.SecurityLevel.S1//设置安全等级
      };

      // this.kvManager.getKVStore(CommonConstants.KV_STORE_ID, options).then((store: distributedKVStore.SingleKVStore) => {
      this.kvManager.getKVStore(CommonConstants.KV_STORE_ID, options).then((store: distributedKVStore.DeviceKVStore) => {
        if (store === null) {
          PhLog.error(`createKvStore getKVStore store is null`, 'KvStoreViewModel');
          reject(`createKvStore getKVStore store is null`);
          return;
        }
        this.kvStore = store;
        this.kvStore.enableSync(true).then(() => {
          resolve(1);
          PhLog.info('createKvStore enableSync success', 'KvStoreViewModel');
        }).catch((error: Error) => {
          reject(`createKvStore enableSync fail, error=${JSON.stringify(error)}`);
          PhLog.error(`createKvStore enableSync fail, error=${JSON.stringify(error)}`, 'KvStoreViewModel');
        });

        this.setDataChangeListener(() => {});
      }).catch((error: Error) => {
        reject(`createKvStore getKVStore failed, error=${JSON.stringify(error)}`);
        PhLog.error(`createKvStore getKVStore failed, error=${JSON.stringify(error)}`, 'KvStoreViewModel');
      })
5. 订阅、移除分布式数据变化
javascript 复制代码
	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}`);
	}
	
	try {
	 //移除订阅数据变化
	    this.kvStore.off('dataChange');
	   } catch (error) {
	     PhLog.error(`removeDataChangeListener off('dataChange') failed, err=${JSON.stringify(error)}`, 'KvStoreViewModel');
	   }
6. 将数据写入分布式数据库。
javascript 复制代码
 put(key: string, value: string): void {
    if (this.kvStore === undefined) {
      return;
    }
    this.kvStore.put(key, value).then(() => {
      PhLog.info(`kvStore.put key=${key} finished}`, 'KvStoreViewModel');
    }).catch((error: Error) => {
      PhLog.error(`kvStore.put key=${key} failed, error=${JSON.stringify(error)}`, 'KvStoreViewModel');
    });
  }
7. 查询数据
javascript 复制代码
 async get(key: string): Promise<boolean | string | number | Uint8Array> {
    return new Promise((resolve, reject) => {
      if (this.kvStore === undefined) {
        PhLog.info('失败了')
        reject();
        return;
      }
      this.kvStore.get(key).then((res) => {
        resolve(res)
        PhLog.info(`kvStore.put key=${key} finished}`, 'KvStoreViewModel');
      }).catch((error: Error) => {
        resolve('')
        PhLog.error(`kvStore.put key=${key} failed, error=${JSON.stringify(error)}`, 'KvStoreViewModel');
      });
    })
  }
8. 同步数据到其他设备
javascript 复制代码
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}`);
  }```
9.删除数据
javascript 复制代码
  async delete(key: string): Promise<void> {
    return new Promise((resolve, reject) => {
      if (this.kvStore === undefined) {
        PhLog.info('失败了')
        reject();
        return;
      }

      this.kvStore.delete(key).then( ()=> {
        resolve();
      })
    })
  }```

到这里整个分布式跨设备数据同步就完成了,可以愉快的进行跨设备数据同步访问了,
PS:过程中需要注意的是安全等级不要忘了设置,要不然不成功哦!!

接下来还会分享分布式跨设备文件访问

相关推荐
前端不太难15 小时前
从单页面到系统化:鸿蒙 App 演进路径
华为·状态模式·harmonyos
元拓数智16 小时前
智能分析落地卡壳?先补好「数据关系+语义治理」这层技术基建
大数据·分布式·ai·spark·数据关系·语义治理
想你依然心痛17 小时前
HarmonyOS 6(API 23)实战:基于悬浮导航、沉浸光感与HMAF的“文思智脑“——PC端AI智能体沉浸式智能写作工作台
人工智能·ar·harmonyos·ai写作
小雨青年17 小时前
鸿蒙 HarmonyOS 6 | Pura X Max 鸿蒙原生适配 09:展开态列表增加字段但不变复杂
华为·harmonyos
richard_yuu17 小时前
鸿蒙治愈游戏模块实战|四大轻量解压游戏、ArkTS动画交互与低功耗落地
游戏·交互·harmonyos
GIS数据转换器20 小时前
农村生活污水治理智慧管控平台
大数据·人工智能·分布式·数据分析·生活·智慧城市
阿钱真强道21 小时前
24 鸿蒙LiteOS GPIO中断实战:从原理到上升沿/下降沿详解
harmonyos·中断·rk·liteos·开源鸿蒙·瑞芯微·rk2206
小崽崽11 天前
华为云云主机 + DeepSeek|快速实现华为云DeepSeek大模型搭建“腾讯云代码助手”客户端集成DeepSeek模型
华为·华为云·腾讯云
Trouvaille ~1 天前
【Redis篇】初识 Redis:特性、应用场景与版本演进
数据结构·数据库·redis·分布式·缓存·中间件·持久化
cd_949217211 天前
鸿蒙系统下抖音存储空间不足怎么办?缓存清理教程
缓存·华为·harmonyos