19db4f7e创建于 2023年4月13日历史提交

Sample:使用分布式对象创建备忘录

分布式对象

分布式数据对象管理框架,是一款面向对象的内存数据管理框架。本框架向应用开发者提供内存对象的创建、查询、删除、修改、订阅等基本数据对象的管理能力,同时具备分布式能力,能够满足在超级终端场景下,相同应用可在多台设备间进行数据对象协同的功能需求。

备忘录应用

在备忘录应用中,通过分布式数据对象框架,当用户在某一端设备上新增备忘录事件,修改编辑事件标题和内容以及清空事件列表时,产生的数据变更结果均可以同步刷新显现在可信组网内其他设备上。

• 应用首页效果图

输入图片说明

• 应用软件监听分布式对象上下线状态显示,红色表示下线,绿色表示上线。

输入图片说明

输入图片说明

开发步骤

分布式数据对象 要求多个设备在同一可信组网中。

1)导入模块

// 导包-分布式数据对象接口
import distributedObject from '@ohos.data.distributedDataObject' 

2)创建一个 分布式数据对象类 DistributedDataModel,用于管理和操作分布式数据对象,以及数据存储;

export default class DistributedDataModel {
	// 用来存储备忘录数据信息,作为分布式对象的documentList属性数据
    documentList = [];
	// 用来存储新建的分布式对象,该对象用来同步数据
    distributedObject; 
	// 下线显示灯状态图标
    imgSrc = "common/red.png"; 
 	// 用来存储分布式对象的数据变更监听
    #callback; 
    // 用来存储分布式对象的上下线的状态变更监听
    #statusCallback; 
    
    constructor() {
		// 创建分布式对象,同时指定分布式对象的属性documentList 和 documentSize 
		// 表示该分布式对象可以同步属性documentList 和 documentSize 
		// 返回创建出的分布式对象distributedObject
		this.distributedObject = distributedObject.createDistributedObject({
			documentList: this.documentList,
			documentSize: 0
		});
		// 初始化时,进行分布式对象的系统授权和组网通信。
		this.share(); 
	}

3)授权许可

分布式对象要实现数据同步必须要通过系统的授权许可。因此需要在项目的config.json文件中声明DATASYNC权限信息。

"reqPermissions": [
  {
    "name": "ohos.permission.DISTRIBUTED_DATASYNC"
  }
],

完成权限申明后,实现向系统请求权限操作。

function grantPermission() {
	let context = featureAbility.getContext(); 
    // 向系统请求权限,用户弹框显示
    // 使用config文件中声明的DATASYNC权限
    // 请求代码可自定义,同时也可自定义异步回调函数
    context.requestPermissionsFromUser(['ohos.permission.DISTRIBUTED_DATASYNC'], 666, function (result) {
       ...
    })
}

4)设置同步的sessionId,进行多个设备的同步组网

将share函数置于在分布式数据对象类的构造函数中,因此当DistributedDataModel初始化时,应用程序会进行分布式对象的同步组网。

share() {
	if (this.distributedObject.__sessionId == undefined) {
		// 申请系统授权许可
		grantPermission()
		// 加入同步组网
		// 设置同步的sessionId,可信组网中有多个设备时,多个设备间的对象需要置为同一个sessionId。
		this.distributedObject.setSessionId("123456") 
	} 
}

5)监听分布式对象的数据变更

setCallback(callback) {
	... 
	// 删除对象的原始变更监听
	if (this.#callback != undefined) {
		this.distributedObject.off("change", this.#callback);
	}   
	this.#callback = callback;       
	// 监听对象的变更,其入参为 type和callback
	// type 是'change'时,表示数据修改监听
	// callback是变更时触发的回调,callback入参为sessionId和changeData,sessionId标识变更对象,changeData为对象变更的属性
	this.distributedObject.on("change", this.#callback);
}

6)监听分布式对象的上下线的状态变更

setStatusCallback(callback) {
	if (this.#statusCallback == callback) {
		return;
	}
	if (this.#statusCallback != undefined) {
		// 删除对象的原始上下线监听
		this.distributedObject.off("status", this.#statusCallback);
	}
	this.#statusCallback = callback;
	// 监听对象状态的变更,其入参为 type和callback
	// type 是'status'时,表示上下先状态更改监听
	// callback是变更时触发的回调,其回调参数sessionId标识变更对象的sessionId,networkId标识对象设备的networkId,status标识对象为'online'(上线)或'offline'(下线)的状态
	this.distributedObject.on("status", this.#statusCallback);
}

应用示例

• 在应用首页,详情页面 和新增页面对应的js文件中导入创建的分布式对象类。

import * as distr from '../../../model/DistributedDataModel.js'

• 对端修改数据时,changeCallback回调触发,依据变更数据changeData和设备组网同步的SessionId ,刷新界面。

changeCallback(sessionId, changeData) {
	changeData.forEach(element => {
		if (element == "documentList") {
			// 刷新界面上的备忘录数据列表
			this.dataModel.documentList = distr.dataModel.distributedObject.documentList;
		}
		else if (element == "documentSize") {
			let size = distr.dataModel.distributedObject.documentSize;
			// 刷新界面上列表总数
			this.dataModel.distributedObject.documentSize = size;
		}
	});
 }
  • 在页面初始化函数中设定监听分布式对象上下线状态回调,进行设备组网检测,并亮灯提示。
  • 在页面初始化函数中设定监听分布式对象的数据变更回调,监听对端设备的数据变更。
onInit() {
	// 监听对端设备的数据变更
	// 发起方要在changeCallback里刷新界面,则需要将正确的this绑定给changeCallback
	distr.dataModel.setCallback(this.changeCallback.bind(this));
	// 监听分布式对象的上下线状态
	distr.dataModel.setStatusCallback((sessionId, networkId, status) => {  
	// 刷新红绿灯界面
		if (status == "online") {
			this.dataModel.imgSrc = "common/green.png";
		} 
		else {
			this.dataModel.imgSrc = "common/red.png";
		}
	})
 }

应用场景

  • 当用户进行“添加”数据操作时,获取页面的新添加的数据后,将其转存储于分布式对象的documentList属性中,并依据新的数据容量重新赋值documentSize属性。
doAdd: function () {
	distr.dataModel.add(this.title, this.content);
	...
}
add(title, content) {
    this.documentList = this.distributedObject.documentList; 
    this.documentList[this.distributedObject.documentSize] = {
        index: this.distributedObject.documentSize, title: title, content: content
    };
     // 分布式对象的数据变更会自动同步到组网内的可信设备
    this.distributedObject.documentList = this.documentList;
    this.distributedObject.documentSize ++;  
	}
  • 当用户查看事件详情,并完成数据修改操作时,应用程序会将用户编辑的该条数据结果更新至分布式对象的documentList属性中。
save: function () {
	// 使用页面数据更新分布式对象属性数据
	distr.dataModel.update(this.editIndex,  this.title, this.content);
	...
}
update(index, title, content) {
	this.documentList[index] = {
		index: index, title: title, content: content
	};
	// 分布式对象的数据变更会自动同步到组网内的可信设备
	this.distributedObject.documentList = this.documentList;
}
  • 当用户在应用首页执行“清空”数据操作时,应用程序则会对分布式对象的documentList和documentSize属性进行重新初始化处理。实现对分布式对象的属性数据更改。
clear: function () {
	 // 触发界面刷新
	this.dataModel.documentList = [];
	distr.dataModel.clear();
	this.dataModel.distributedObject.documentSize = 0;
 },
clear() {
	this.documentList = []; 
    // 分布式对象的数据变更会自动同步到组网内的可信设备
    this.distributedObject.documentList = this.documentList;  
    this.distributedObject.documentSize = 0; 
}