如果你也对鸿蒙开发感兴趣,加入“Harmony自习室”吧!扫描下方名片,关注公众号,公众号更新更快,同时也有更多学习资料和技术讨论群。
1、前 言
本文是基于鸿蒙跨设备协同开发07——动态控制应用接续的进一步讨论。
我们在鸿蒙跨设备协同开发06——应用接续中有提到:
-
为了接续体验,在onContinue回调中使用wantParam传输的数据需要控制在100KB以下(大数据量使用分布式数据对象进行同步)
当我们遇到需要迁移的数据大于100KB时,则需要分布式数据对象进行同步了。
需要注意:
如果是API11及之前版本,实现分布式数据对象同步功能时,需要申请 ohos.permission.DISTRIBUTED_DATASYNC 权限,如果是API 12及以上时,无需申请此权限。
2、分布式数据对象介绍
分布式数据对象提供管理基本数据对象的相关能力,包括创建、查询、删除、修改、订阅等;同时支持相同应用多设备间的分布式数据对象协同能力。
分布式数据对象由 @ohos.data.distributedDataObject 模块提供能力。导入模块代码如下:
import { distributedDataObject } from '@kit.ArkData';
核心的API有:
// 创建一个分布式数据对象
create(context: Context, source: object): DataObject
// 随机创建一个sessionId
genSessionId(): string
创建一个分布式数据对象和随机创建一个sessionId示例如下:
// 创建一个分布式数据对象
// 导入模块
import { UIAbility } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { window } from '@kit.ArkUI';
let g_object: distributedDataObject.DataObject|null = null;
class SourceObject {
name: string
age: number
isVis: boolean
constructor(name: string, age: number, isVis: boolean) {
this.name = name
this.age = age
this.isVis = isVis
}
}
class EntryAbility extends UIAbility {
onWindowStageCreate(windowStage: window.WindowStage) {
let source: SourceObject = new SourceObject("jack", 18, false);
// 创建一个分布式数据对象
g_object = distributedDataObject.create(this.context, source);
}
}
// 创建一个随机sessionId
let sessionId: string = distributedDataObject.genSessionId();
分布式数据对象的使用核心还是在于DataObject,DataObject表示一个分布式数据对象。它主要的API有:
// 设置sessionId,可信组网中有多个设备处于协同状态时,如果多个设备间的分布式对象设置为同一个sessionId,就能自动同步。
// callback接口和Promise接口
setSessionId(sessionId: string, callback: AsyncCallback<void>): void
setSessionId(sessionId?: string): Promise<void>
// 退出所有已加入的session
setSessionId(callback: AsyncCallback<void>): void
// 监听/取消监听 分布式数据对象的数据变更。
on(type: 'change', callback: (sessionId: string, fields: Array<string>) => void): void
off(type: 'change', callback?: (sessionId: string, fields: Array<string>) => void): void
// 监听/取消监听 分布式数据对象的上下线。
on(type: 'status', callback: (sessionId: string, networkId: string, status: 'online' | 'offline' ) => void): void
off(type: 'status', callback?:(sessionId: string, networkId: string, status: 'online' | 'offline') => void): void
// 保存分布式数据对象(callback回调和Promise版本)
/*
对象数据保存成功后,当应用存在时不会释放对象数据,当应用退出后,重新进入应用时,恢复保存在设备上的数据。
有以下几种情况时,保存的数据将会被释放:
- 存储时间超过24小时。
- 应用卸载。
- 成功恢复数据之后。
【deviceId为 local 时,表示存储在本地设备】
*/
save(deviceId: string, callback: AsyncCallback<SaveSuccessResponse>): void
save(deviceId: string): Promise<SaveSuccessResponse>
// 撤回保存的分布式数据对象(callback回调和Promise版本)
// 如果对象保存在本地设备,那么将删除所有受信任设备上所保存的数据。
// 如果对象保存在其他设备,那么将删除本地设备上的数据。
revokeSave(callback: AsyncCallback<RevokeSaveSuccessResponse>): void
revokeSave(): Promise<RevokeSaveSuccessResponse>
/*
绑定分布式对象中的单个资产与其对应的数据库信息,当前版本只支持分布式对象中的资产与关系型数据库的绑定。使用callback方式异步回调。
当分布式对象中包含的资产和关系型数据库中包含的资产指向同一个实体资产文件,即两个资产的Uri相同时,就会存在冲突,我们把这种资产称为融合资产。如果需要分布式数据管理进行融合资产的冲突解决,需要先进行资产的绑定。当应用退出session后,绑定关系随之消失。
*/
bindAssetStore(assetKey: string, bindInfo: BindInfo, callback: AsyncCallback<void>): void
bindAssetStore(assetKey: string, bindInfo: BindInfo): Promise<void>
⭐️ 以保存数据为例,示例代码如下:
g_object.setSessionId("123456");
g_object.save("local").then((result: distributedDataObject.SaveSuccessResponse) => {
console.info("save callback");
console.info("save sessionId " + result.sessionId);
console.info("save version " + result.version);
console.info("save deviceId " + result.deviceId);
}).catch((err: BusinessError) => {
console.info("save failed, error code = " + err.code);
console.info("save failed, error message: " + err.message);
});
⭐️ 以监听数据变化为例,示例代码如下:
// 删除数据变更回调changeCallback
g_object.off("change", (sessionId: string, fields: Array<string>) => {
console.info("change" + sessionId);
if (g_object != null && fields != null && fields != undefined) {
for (let index: number = 0; index < fields.length; index++) {
console.info("changed !" + fields[index] + " " + g_object[fields[index]]);
}
}
});
// 删除所有的数据变更回调
g_object.off("change");
3、使用分布式数据对象接续基础数据
使用分布式数据对象接续与普通的应用接续相似(详见之前的文章鸿蒙跨设备协同开发06——应用接续),需要在源端onContinue()接口中进行数据保存,并在对端的onCreate()/onNewWant()接口中进行数据恢复。
标签:string,鸿蒙,对象,08,undefined,let,数据,分布式 From: https://blog.csdn.net/harmonyClassRoom/article/details/143244707