• Home
  • History
  • Annotate
Name Date Size #Lines LOC

..17-Mar-2025-

entry/H17-Mar-2025-727557

pictures/H17-Mar-2025-

ReadMe.mdH A D17-Mar-20258.3 KiB245201

build.gradleH A D17-Mar-20251.4 KiB4844

settings.gradleH A D17-Mar-202517 21

ReadMe.md

1# Sample:使用分布式对象创建备忘录
2
3 ## **分布式对象**
4
5分布式数据对象管理框架,是一款面向对象的内存数据管理框架。本框架向应用开发者提供内存对象的创建、查询、删除、修改、订阅等基本数据对象的管理能力,同时具备分布式能力,能够满足在超级终端场景下,相同应用可在多台设备间进行数据对象协同的功能需求。
6
7 ## **备忘录应用**
8
9在备忘录应用中,通过分布式数据对象框架,当用户在某一端设备上新增备忘录事件,修改编辑事件标题和内容以及清空事件列表时,产生的数据变更结果均可以同步刷新显现在可信组网内其他设备上。
10
11• 应用首页效果图
12
13![输入图片说明](pictures/首页展示.jpg)
14
15• 应用软件监听分布式对象上下线状态显示,红色表示下线,绿色表示上线。
16
17 ![输入图片说明](pictures/下线状态提示.png)
18
19 ![输入图片说明](pictures/上线状态提示.png)
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```