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

分布式数据服务的简单实现(OpenHarmonyJSUI)

时间:2023-03-14 22:48:17 科技观察

更多开源内容请访问:51CTO开源基础软件社区https://ost.51cto.comDemo效果展示先,我们来看看我们要实现的demo效果。点击按钮同步数据后,设备A向数据库广播一个字符串,设备B读取变化后渲染接收到的字符串。分布式数据服务概述HarmonyOS提供了我们可以在不同的设备之间获取相同的数据,这叫做分布式数据库。只要是可信设备,就可以获得分布式数据库中存储的所有数据。因此,数据库一般用于需要在不同设备之间获取相同数据的场景。KV数据模型“KV数据模型”是“Key-Value数据模型”的缩写,“Key-Value”是“键-值”的意思。它是一种NoSQL(非关系数据存储系统)数据库,其数据以键值对的形式组织、索引和存储。由于KV数据模型用于不涉及太多数据关系和业务关系的数据存储,因此相比传统SQL数据存储具有更高的读写性能。分布式数据库同步底层通信组件完成设备发现和认证,并通知上层应用(包括分布式数据服务)设备在线。分布式数据服务收到设备上线消息后,可以在两台设备之间建立一条加密的数据传输通道,并通过该通道在两台设备之间同步数据。分布式数据服务提供两种同步方式:手动同步和自动同步。手动同步:由应用程序调用同步接口触发,需要指定需要同步的设备列表和同步方式。同步方式分为PULL_ONLY(将远端数据拉到本端)、PUSH_ONLY(将本地数据推送到远端)和PUSH_PULL(将本端数据拉到远端同时也将远端数据拉到本端)本地端)。内部接口支持按条件过滤同步,将满足条件的数据同步到远端。自动同步:包括全量同步和按条件订阅同步。全量同步,分布式数据库自动将本地数据推送到远端,同时将远端数据拉取到本地,完成数据同步。同步的时机包括设备上线、应用更新数据等,应用不需要主动调用sync接口;内部接口支持条件订阅同步,自动将远端满足订阅条件的数据同步到本端。单版本分布式数据库单版本是指数据以单个KV表项的形式保存在本地,每个Key只保存一个表项。当数据被用户本地修改时,不管是否已经同步出去,直接在这个入口上修改。同步也是基于此,将最新的修改按照本地写入或更改的先后顺序,一一同步到远程设备。简单来说,单版本分布式数据库以键值对(Key,Value)的形式存储数据。只能有一个键不能重复。当修改本地关键数据时,会直接修改,然后再次更新最新的数据。同步出来。设备协同分布式数据库建立在单版本分布式数据库之上,将应用程序中存储的KV数据中的Key与设备的DeviceID标识进行拼接,可以保证各个设备产生的数据严格隔离,底层按照设备维度管理这些数据,设备协同分布式数据库支持查询设备维度的分布式数据,但不支持修改远程设备同步的数据。简单来说就是在单版本分布式数据库的key前面拼接设备的deviceid,保证每个设备的数据库都能区分,知道是哪个设备添加了数据;但无法修改远程设备同步的数据。即在A设备上添加的键值对数据被推送到B设备,B设备只能读取数据,不能修改数据。下面简单写一个分布式数据库的demo,进入实际代码链接。代码封装在一个项目中,可能不止一个地方用到了分布式数据库。为了提高代码的复用性,方便后续维护,有必要对这部分代码进行封装。所以这里我们先新建一个模块文件,然后在文件中新建一个js模块(我这里新建的模块命名为kv.js),把分布式数据服务的代码封装在里面。以后要使用相关功能,只需要调用这个文件即可,可以有效避免重复工作,提高代码的可读性。导入模块创建一个单独的js文件封装数据库模块,供后续调用。从“@ohos.data.distributedData”导入分布式数据;创建分布式数据库创建分布式数据库分为三个步骤:创建一个KvManagerConfig对象。bundleName必须与您创建的项目一致。创建分布式数据库管理器。这里要注意选项中的kvStoreType参数。0为设备协同分布式数据库,1为单版本数据库。区别上面已经说了。如果没有特殊业务,一般选择单版本数据库。选项中securityLevel级别越高,限制越多。获取分布式数据库。下面是具体的实现代码:createKvStore(callback){if(typeof(this.kvStore)==='undefined'){//创建KvManagerConfig对象varconfig={bundleName:'com.example.myapplication',userInfo:{userId:'0',userType:0}};让自己=这个;distributedData.createKVManager(config).then((manager)=>{//创建分布式数据库管理器self.kvManager=manager;varoptions={createIfMissing:true,encrypt:false,backup:false,autoSync:true,kvStoreType:1,//级别越高,限制越多securityLevel:1,};self.kvManager.getKVStore(STORE_ID,options).then((store)=>{self.kvStore=store;callback();});});}else{回调();}}增删改查增删改查界面比较简单。首先简单看一下api接口的功能和参数:插入和更新数据:put(key:string,value:Uint8Array|string|number|boolean,callback:AsyncCallback):voidput(key:string,value:Uint8Array|string|number|boolean):Promise删除数据:delete(key:string,callback:AsyncCallback):voiddelete(key:string):Promise。查询数据:get(key:string,callback:AsyncCallback):voidget(key:string):Promise。那我们来写增删改查的代码吧。插入和更新数据sendMessage(key,value){letself=this;this.createKvStore(()=>{self.put(key,value);});}put(key,value){console.info('dataischanging...');this.kvStore.put(key,value).then((data)=>{console.info('dataChange:'+JSON.stringify(data));this.kvStore.get(key).then((data)=>{console.info('dataChange:'+JSON.stringify(data));});}).catch((err)=>{});}删除数据delete(key){this.kvStore.delete(key).then((data)=>{}).catch((err)=>{});}查询数据get(key){this.kvStore.get(key).then((data)=>{}).catch((err)=>{});}订阅数据变化订阅数据变化:on(event:'dataChange',type:SubscribeType,observer:Callback):voidon(event:'syncComplete',syncCallback:Callback>):作废。setOnMessageReceivedListener(callback){让self=this;this.createKvStore(()=>{self.kvStore.on('dataChange',1,(data)=>{console.info('dataChange:'+JSON.stringify(data));for(vari=0;i{console.log("chw---islistening")//传递的字符串必须反序列化为JSON对象this.testReceiveStr=v;this.isReceiveInfo=true;this.changeType=type1;console.log("chw---接收数据:"+v);});console.log("chw---initend")},广播同步数据send(){varthat=this;//这里注意,如果发送的数据类型是对象或者数组,需要将对象或者数组序列化成JSON字符串this.kvStoreModel.sendMessage(that.key,"message123");console.log("chw---issending")},js完整代码importfeatureAbilityfrom'@ohos.ability.featureAbility';importKvStoreModelfrom'../../model/kv.js';exportdefault{数据:{kvStoreModel:newKvStoreModel(),isReceiveInfo:false,changeType:1,key:"openharmony",testReceiveStr:"nothing"},onInit(){console.log("chw---initstart")这个。授予权限();//type表示操作0:插入数据,1:修改数据:2:删除数据this.kvStoreModel.setOnMessageReceivedListener((k,v,type1)=>{console.log("chw---islistening")//传递的字符串将被反序列化ForJSONobjectthis.testReceiveStr=v;this.isReceiveInfo=true;this.changeType=type1;console.log("chw---接收数据:"+v);});console.log("chw---initend")},grantPermission(){letcontext=featureAbility.getContext()context.requestPermissionsFromUser(['ohos.permission.DISTRIBUTED_DATASYNC'],666,函数(res){//console.log("chw---获取权限结果:"+res)})},send(){varthat=this;//这里注意,如果发送的数据类型是对象或者数组,需要将对象或者数组序列化成JSON字符串this.kvStoreModel.sendMessage(that.key,"message123");console.log("chw---issending")},}界面效果图为了方便查看数据同步,当然也可以打开控制台查看打印信息。这里我们选择直接渲染数据同步,在hml文件中添加如下代码:接收信息:{{testReceiveStr}}同步数据

这样我们就完成了一个分布式数据库的小演示。了解更多开源信息,请访问:51CTO开源基础软件社区https://ost.51cto.com。