
基于分布式数据对象的跨设备数据同步
场景
传统跨设备数据同步,需开发者完成:建立通信链接、消息收发处理、错误重试、数据冲突解决等一系列消息处理逻辑,工作量大且复杂。
设备之间的数据都是"变量",分布式数据对象即实现了对“变量”的“全局”访问。为开发者在分布式应用场景下提供简单易用的JS接口,轻松实现多设备间同应用的数据协同,同时设备间可以监听对象的状态和数据变更。
方案介绍
使用分布式数据对象进行跨设备数据同步时,需要申请ohos.permission.DISTRIBUTED_DATASYNC权限,允许不同设备间的数据交换,该权限为user_grant,需要向用户弹窗申请授权。
随后创建分布式数据对象并加入可信组网(进行跨设备数据同步的设备需要登录相同的华为账号,同一网络,并开启蓝牙)。
注:一个分布式对象加入组网时,如果它的数据与组网中的数据不同,它会刷新组网中的数据。若希望加入组网时不刷新组网中的数据,并且得到组网中的数据,可以将属性设置为undefined。(例如下文中的Message对象设置为:new Message(undefined,undefined) )。
实现效果
A、B两台设备分别点击创建分布式数据对象,并开启数据变更监听,此时在A设备输入数据,B设备即可自动同步。
开发步骤
一、申请权限
使用分布式数据对象进行跨设备数据同步时,需要申请ohos.permission.DISTRIBUTED_DATASYNC权限,该权限为user_grant,需要向用户弹窗申请授权。用户若拒绝授权,需要引导用户到设置--隐私和安全--多设备协同中授权,调用分布式数据对象相关能力时,建议先判断用户是否已授权。申请权限可参考:
二、创建分布式对象并加入组网
实现方案:
封装DistributedDataModel 类,创建实例时根据传入的source:Object对象(本文传入一个Message对象,包含createTime,message两个属性),通过distributedDataObject.create方法创建对应的分布式数据对象并通过setSessionId方法设置其sessionId。
封装单例类GlobalThis用于存储mesaage,并通过Observed装饰,当message变化时刷新到TextArea中。
注:同一个设备只能有一个分布式对象加入相同的sessionId,A对象已经加入sessionId后,B对象在加入同一sessionId会失败。
核心代码:
三、操作分布式数据对象
(1)监听数据变更。
A、B两条设备组网后,A设备开启监听后(on("change")),B设备修改数据,随后A设备读取数据,此时读取到的是B设备修改后的数据。
随后A删除监听(off("change")),B设备再次修改数据,随后A设备读取数据,此时读取到的是B设备修改前的数据。
(2)监听组网内分布式数据对象的上下线及移除监听。
通过on("status")监听分布式对象的上下线,当对端设备上下线时即可触发业务回调,当不在需要监听时可通过 off("status")移除监听。
(3)保存分布式数据对象及撤回保存的分布式数据对象。
save(deviceId: string),保存分布式数据对象。deviceId表示保存数据的设备号,标识需要保存对象的设备,默认为"local",代表保存在本地。
通过save("local")将对象数据保存成功后,当应用存在时不会释放对象数据,当应用退出后,重新进入应用时,恢复保存在设备上的数据。
通过revokeSave()撤回保存的分布式数据对象,如果对象保存在本地设备,那么将删除所有受信任设备上所保存的数据。如果对象保存在其他设备,那么将删除本地设备上的数据。
注意:revokesave是撤销还没有被恢复的数据。若A设备将数据save到B设备,B设备创建分布式对象时会自动恢复数据,此时A设备revokesave无法撤销B设备已回复的数据。
deviceId获取方式 :
1、on('status')的时候可以获得标识对象设备的networkId(使用该networkId即可)。
2、 在接续场景中,可以重wantParam里获取targetDevice,参考链接:应用接续。
参考文档
