ReadMe.md
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```