1# Sample:使用分布式对象创建备忘录 2 3 ## **分布式对象** 4 5分布式数据对象管理框架,是一款面向对象的内存数据管理框架。本框架向应用开发者提供内存对象的创建、查询、删除、修改、订阅等基本数据对象的管理能力,同时具备分布式能力,能够满足在超级终端场景下,相同应用可在多台设备间进行数据对象协同的功能需求。 6 7 ## **备忘录应用** 8 9在备忘录应用中,通过分布式数据对象框架,当用户在某一端设备上新增备忘录事件,修改编辑事件标题和内容以及清空事件列表时,产生的数据变更结果均可以同步刷新显现在可信组网内其他设备上。 10 11• 应用首页效果图 12 13 14 15• 应用软件监听分布式对象上下线状态显示,红色表示下线,绿色表示上线。 16 17  18 19  20 21 ## **开发步骤** 22 23分布式数据对象 要求多个设备在同一可信组网中。 24 25 ### 1)导入模块 26 27```js 28// 导包-分布式数据对象接口 29import distributedObject from '@ohos.data.distributedDataObject' 30``` 31 32 ### 2)创建一个 分布式数据对象类 DistributedDataModel,用于管理和操作分布式数据对象,以及数据存储; 33 34```js 35export default class DistributedDataModel { 36 // 用来存储备忘录数据信息,作为分布式对象的documentList属性数据 37 documentList = []; 38 // 用来存储新建的分布式对象,该对象用来同步数据 39 distributedObject; 40 // 下线显示灯状态图标 41 imgSrc = "common/red.png"; 42 // 用来存储分布式对象的数据变更监听 43 #callback; 44 // 用来存储分布式对象的上下线的状态变更监听 45 #statusCallback; 46 47 constructor() { 48 // 创建分布式对象,同时指定分布式对象的属性documentList 和 documentSize 49 // 表示该分布式对象可以同步属性documentList 和 documentSize 50 // 返回创建出的分布式对象distributedObject 51 this.distributedObject = distributedObject.createDistributedObject({ 52 documentList: this.documentList, 53 documentSize: 0 54 }); 55 // 初始化时,进行分布式对象的系统授权和组网通信。 56 this.share(); 57 } 58``` 59 60 ### 3)授权许可 61 62分布式对象要实现数据同步必须要通过系统的授权许可。因此需要在项目的config.json文件中声明DATASYNC权限信息。 63 64``` 65"reqPermissions": [ 66 { 67 "name": "ohos.permission.DISTRIBUTED_DATASYNC" 68 } 69], 70``` 71 72完成权限申明后,实现向系统请求权限操作。 73 74```js 75function grantPermission() { 76 let context = featureAbility.getContext(); 77 // 向系统请求权限,用户弹框显示 78 // 使用config文件中声明的DATASYNC权限 79 // 请求代码可自定义,同时也可自定义异步回调函数 80 context.requestPermissionsFromUser(['ohos.permission.DISTRIBUTED_DATASYNC'], 666, function (result) { 81 ... 82 }) 83} 84``` 85 86 ### 4)设置同步的sessionId,进行多个设备的同步组网 87 88将share函数置于在分布式数据对象类的构造函数中,因此当DistributedDataModel初始化时,应用程序会进行分布式对象的同步组网。 89 90```js 91share() { 92 if (this.distributedObject.__sessionId == undefined) { 93 // 申请系统授权许可 94 grantPermission() 95 // 加入同步组网 96 // 设置同步的sessionId,可信组网中有多个设备时,多个设备间的对象需要置为同一个sessionId。 97 this.distributedObject.setSessionId("123456") 98 } 99} 100``` 101 102 ### 5)监听分布式对象的数据变更 103 104```js 105setCallback(callback) { 106 ... 107 // 删除对象的原始变更监听 108 if (this.#callback != undefined) { 109 this.distributedObject.off("change", this.#callback); 110 } 111 this.#callback = callback; 112 // 监听对象的变更,其入参为 type和callback 113 // type 是'change'时,表示数据修改监听 114 // callback是变更时触发的回调,callback入参为sessionId和changeData,sessionId标识变更对象,changeData为对象变更的属性 115 this.distributedObject.on("change", this.#callback); 116} 117``` 118 119 ### 6)监听分布式对象的上下线的状态变更 120 121```js 122setStatusCallback(callback) { 123 if (this.#statusCallback == callback) { 124 return; 125 } 126 if (this.#statusCallback != undefined) { 127 // 删除对象的原始上下线监听 128 this.distributedObject.off("status", this.#statusCallback); 129 } 130 this.#statusCallback = callback; 131 // 监听对象状态的变更,其入参为 type和callback 132 // type 是'status'时,表示上下先状态更改监听 133 // callback是变更时触发的回调,其回调参数sessionId标识变更对象的sessionId,networkId标识对象设备的networkId,status标识对象为'online'(上线)或'offline'(下线)的状态 134 this.distributedObject.on("status", this.#statusCallback); 135} 136``` 137 138 ## **应用示例** 139 140• 在应用首页,详情页面 和新增页面对应的js文件中导入创建的分布式对象类。 141 142```js 143import * as distr from '../../../model/DistributedDataModel.js' 144``` 145 146• 对端修改数据时,changeCallback回调触发,依据变更数据changeData和设备组网同步的SessionId ,刷新界面。 147 148```js 149changeCallback(sessionId, changeData) { 150 changeData.forEach(element => { 151 if (element == "documentList") { 152 // 刷新界面上的备忘录数据列表 153 this.dataModel.documentList = distr.dataModel.distributedObject.documentList; 154 } 155 else if (element == "documentSize") { 156 let size = distr.dataModel.distributedObject.documentSize; 157 // 刷新界面上列表总数 158 this.dataModel.distributedObject.documentSize = size; 159 } 160 }); 161 } 162``` 163 164- 在页面初始化函数中设定监听分布式对象上下线状态回调,进行设备组网检测,并亮灯提示。 165- 在页面初始化函数中设定监听分布式对象的数据变更回调,监听对端设备的数据变更。 166 167```js 168onInit() { 169 // 监听对端设备的数据变更 170 // 发起方要在changeCallback里刷新界面,则需要将正确的this绑定给changeCallback 171 distr.dataModel.setCallback(this.changeCallback.bind(this)); 172 // 监听分布式对象的上下线状态 173 distr.dataModel.setStatusCallback((sessionId, networkId, status) => { 174 // 刷新红绿灯界面 175 if (status == "online") { 176 this.dataModel.imgSrc = "common/green.png"; 177 } 178 else { 179 this.dataModel.imgSrc = "common/red.png"; 180 } 181 }) 182 } 183``` 184 185 ## **应用场景** 186 187- 当用户进行“添加”数据操作时,获取页面的新添加的数据后,将其转存储于分布式对象的documentList属性中,并依据新的数据容量重新赋值documentSize属性。 188 189```js 190doAdd: function () { 191 distr.dataModel.add(this.title, this.content); 192 ... 193} 194``` 195 196```js 197add(title, content) { 198 this.documentList = this.distributedObject.documentList; 199 this.documentList[this.distributedObject.documentSize] = { 200 index: this.distributedObject.documentSize, title: title, content: content 201 }; 202 // 分布式对象的数据变更会自动同步到组网内的可信设备 203 this.distributedObject.documentList = this.documentList; 204 this.distributedObject.documentSize ++; 205 } 206``` 207- 当用户查看事件详情,并完成数据修改操作时,应用程序会将用户编辑的该条数据结果更新至分布式对象的documentList属性中。 208 209```js 210save: function () { 211 // 使用页面数据更新分布式对象属性数据 212 distr.dataModel.update(this.editIndex, this.title, this.content); 213 ... 214} 215``` 216 217```js 218update(index, title, content) { 219 this.documentList[index] = { 220 index: index, title: title, content: content 221 }; 222 // 分布式对象的数据变更会自动同步到组网内的可信设备 223 this.distributedObject.documentList = this.documentList; 224} 225``` 226 227- 当用户在应用首页执行“清空”数据操作时,应用程序则会对分布式对象的documentList和documentSize属性进行重新初始化处理。实现对分布式对象的属性数据更改。 228 229```js 230clear: function () { 231 // 触发界面刷新 232 this.dataModel.documentList = []; 233 distr.dataModel.clear(); 234 this.dataModel.distributedObject.documentSize = 0; 235 }, 236``` 237 238```js 239clear() { 240 this.documentList = []; 241 // 分布式对象的数据变更会自动同步到组网内的可信设备 242 this.distributedObject.documentList = this.documentList; 243 this.distributedObject.documentSize = 0; 244} 245```