当前位置: 首页 > 科技观察

OpenHarmony——分布式数据对象的功能实践_0

时间:2023-03-15 16:23:57 科技观察

更多内容请访问:51CTO与华为官方共建鸿蒙技术社区https://ost.51cto.com分布式数据的功能实践数据对象分布式数据对象管理框架是一个面向对象的内存数据管理框架,为应用开发者提供内存对象的创建、查询、删除、修改、订阅等基础数据对象的管理能力。同时具备分布式能力,满足超级终端场景下同一应用的多设备间的数据对象协同需求。一、基本概念分布式数据对象提供JS接口,允许开发者像使用本地对象一样使用分布式对象。2.运行示意图3.约束和限制只有具有相同bundleName的应用程序才能在不同设备之间直接同步。不建议创建太多分布式对象,每个分布式对象会占用100-150KB内存。每个对象大小不超过500KB。支持JS界面互通,不支持与其他语言互通。4.开发指导(1)接口描述参考分布式对象头文件:importdistributedObjectfrom'@ohos.data.distributedDataObject'interface:DistrubutedObject:5.开发步骤(1)ImportinterfaceimportdistributedObjectfrom'@ohos.data.distributedDataObject''(2)Createobject//创建一个对象,该对象包含3个基本属性:name、age和isVis;2个复杂属性:parent,listvarg_object=distributedObject.createDistributedObject({name:undefined,age:undefined,isVis:true,parent:undefined,list:undefined});注意:**在构造分布式对象时,新增一个默认的SESSION_ID属性,并为每个属性添加set和get方法。构造方法如下:constSESSION_ID="__sessionId";classDistributed{constructor(obj){this.__proxy=obj;Object.keys(obj).forEach(key=>{Object.defineProperty(this,key,{enumerable:true,configurable:true,get:function(){returnthis.__proxy[key];},set:function(newValue){this.__proxy[key]=newValue;}});});对象.defineProperty(this,SESSION_ID,{enumerable:true,configurable:true,get:function(){returnthis.__proxy[SESSION_ID];},set:function(newValue){this.__proxy[SESSION_ID]=newValue;}});this.__objectId=randomNum();console.info("构造函数成功");}//----------------------------------------------------其余内容此处略去__proxy;__objectId;}(3)加入同步网络发起者:使用distributedObject。genSessionId()方法生成一个随机字符串并将其设置为对象的__sessionId属性的值g_object.setSessionId(distributedObject.genSessionId());说明:**setSessionId不仅设置了SESSION_ID属性的值,还对对象进行了重新封装,添加了SESSION_ID对应的同步联网的内容。具体方法如下:setSessionId(sessionId){if(sessionId==null||sessionId==""){leaveSession(this.__proxy);//退出同步联网returnfalse;}if(this.__proxy[SESSION_ID]==sessionId){console.info("同一会话已加入"+sessionId);返回真;}leaveSession(this.__proxy);//退出同步网络//加入sessionId值对应的同步网络并返回新生成的对象letobject=joinSession(this.__proxy,this.__objectId,sessionId);if(object!=null){this.__proxy=object;//替换新生成的对象returntrue;}返回假;被拉起的对端设备获取Intent中的sessionId,执行setSessionId加入同步网络,完成数据同步。//sessionId与发起者的__sessionId一致g_object.setSessionId(sessionId);(4)启用变更监视器,用于监控对象的变更。当同步网络中的对象属性值发生变化时,会触发自定义回调changeCallback。changeCallback:函数(sessionId,changeData){console.info("change"+sessionId+""+this.response);if(changeData!=null&&changeData!=undefined){changeData.forEach(element=>{console.info("changed!"+element+""+g_object[element]);});}}g_object.on("改变",this.changeCallback);(5)修改对象属性g_object.name="jack";g_object.age=19;g_object.isVis=false;g_object.parent={mother:"jackmom",father:"jackDad"};g_object.list=[{mother:"jackmom"},{father:"jackDad"}];//对端设备接收change回调,字段为name、age、isVis、parent和list说明:对于复杂类型的数据修改,目前支持对根属性的修改,但目前不支持对下层属性的修改。示例如下://支持的修饰方式g_object.parent={mother:"mom",father:"dad"};//不支持的修饰方式g_object.parent.mother="mom";(6)访问对象控制台.info("name"+g_object["name"]);//获取网络最新数据(7)删除??监控数据change//删除change回调changeCallbackg_object.off("change",changeCallback);//删除所有change回调g_object.off("change");(8)监控分布式对象的在线和离线状态,并启用状态监控。当同步网络中对象的在线状态发生变化时,会触发自定义回调statusCallback。statusCallback:function(sessionId,networkid,status){this.response+="状态改变"+sessionId+""+status+""+networkId;}g_object.on("status",this.changeCallback);(9)删除监听分布式对象的离线和离线回调//删除在线和离线回调changeCallbackg_object.off("status",changeCallback);//删除所有在线和离线回调g_object.off("status");(10)退出同步联网//两种方法都可用g_object.setSessionId("");g_object.setSessionId();6.内部实现(1)主要接口类DistributedObjectStoreImpl:publicDistributedObjectStore{public:DistributedObject*CreateObject(conststd::string&sessionId)override;uint32_tDeleteObject(conststd::string&sessionId)覆盖;//这里的watch主要是变化监听uint32_tWatch(DistributedObject*object,std::shared_ptrwatcher)override;uint32_tUnWatch(DistributedObject*object)覆盖;//其余内容略去}(2)调用顺序7.小结通过本文的学习,您可以了解分布式数据对象的主要接口、通用调用方法和功能实现。结合相应的内容,可以进一步深入学习分布式数据对象的同步机制。下一步:(1)重点理解同步组网的构建原理。(2)重点了解同步组网中监控变化和状态变化的实现。更多资讯请浏览:?????????????????????????????????????????????????????????