HarmonyOS Next 应用元服务开发-分布式数据对象迁移数据文件资产迁移

devtools/2024/12/28 17:57:39/

文件资产迁移,对于图片、文档等文件类数据,需要先将其转换为资产commonType.Asset类型,再封装到分布式数据对象中进行迁移。迁移实现方式与普通的分布式数据对象类似,下面仅针对差异部分进行说明。

在源端,将需要迁移的文件资产保存到分布式数据对象DataObject中,执行流程如下:
将文件资产拷贝到分布式文件目录下,相关接口与用法详见基础文件接口。
使用分布式文件目录下的文件创建Asset资产对象。
将Asset资产对象作为分布式数据对象的根属性保存。
随后,与普通数据对象的迁移的源端实现相同,可以使用该数据对象加入组网,并进行持久化保存。

示例如下:

// 导入模块
import { UIAbility, AbilityConstant } from '@kit.AbilityKit';
import { distributedDataObject, commonType } from '@kit.ArkData';
import { fileIo, fileUri } from '@kit.CoreFileKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { BusinessError } from '@ohos.base';
const TAG: string = '[MigrationAbility]';
const DOMAIN_NUMBER: number = 0xFF00;// 数据对象定义
class ParentObject {mother: stringfather: stringconstructor(mother: string, father: string) {this.mother = motherthis.father = father}
}class SourceObject {name: string | undefinedage: number | undefinedisVis: boolean | undefinedparent: ParentObject | undefinedattachment: commonType.Asset | undefined  // 新增资产属性constructor(name: string | undefined, age: number | undefined, isVis: boolean | undefined,parent: ParentObject | undefined, attachment: commonType.Asset | undefined) {this.name = namethis.age = agethis.isVis = isVisthis.parent = parentthis.attachment = attachment;}
}export default class MigrationAbility extends UIAbility {d_object?: distributedDataObject.DataObject;async onContinue(wantParam: Record<string, Object>): Promise<AbilityConstant.OnContinueResult> {// ...// 1. 将资产写入分布式文件目录下let distributedDir: string = this.context.distributedFilesDir;  // 获取分布式文件目录路径let fileName: string = '/test.txt';                        // 文件名let filePath: string = distributedDir + fileName;          // 文件路径try {// 在分布式目录下创建文件let file = fileIo.openSync(filePath, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);hilog.info(DOMAIN_NUMBER, TAG, 'Create file success.');// 向文件中写入内容(若资产为图片,可将图片转换为buffer后写入)fileIo.writeSync(file.fd, '[Sample] Insert file content here.');// 关闭文件fileIo.closeSync(file.fd);} catch (error) {let err: BusinessError = error as BusinessError;hilog.error(DOMAIN_NUMBER, TAG, `Failed to openSync / writeSync / closeSync. Code: ${err.code}, message: ${err.message}`);}// 2. 使用分布式文件目录下的文件创建资产对象let distributedUri: string = fileUri.getUriFromPath(filePath); // 获取分布式文件Uri// 获取文件参数let ctime: string = '';let mtime: string = '';let size: string = '';await fileIo.stat(filePath).then((stat: fileIo.Stat) => {ctime = stat.ctime.toString();  // 创建时间mtime = stat.mtime.toString();  // 修改时间size = stat.size.toString();    // 文件大小})// 创建资产对象let attachment: commonType.Asset = {name: fileName,uri: distributedUri,path: filePath,createTime: ctime,modifyTime: mtime,size: size,}// 3. 将资产对象作为分布式数据对象的根属性,创建分布式数据对象let parentSource: ParentObject = new ParentObject('jack mom', 'jack Dad');let source: SourceObject = new SourceObject("jack", 18, false, parentSource, attachment);this.d_object = distributedDataObject.create(this.context, source);// 生成组网id,激活分布式数据对象,save持久化保存// ...
}

对端需要先创建一个各属性为空的Asset资产对象作为分布式数据对象的根属性。在接收到on()接口status为restored的事件的回调时,表示包括资产在内的数据同步完成,可以像获取基本数据一样获取到源端的资产对象。
说明
对端创建分布式数据对象时,SourceObject对象中的资产不能直接使用undefined初始化,需要创建一个各属性为空的Asset资产对象,否则会导致资产同步失败。

示例代码如下:

import { UIAbility, Want } from '@kit.AbilityKit';
import { distributedDataObject, commonType } from '@kit.ArkData';
import { hilog } from '@kit.PerformanceAnalysisKit';
const TAG: string = '[MigrationAbility]';
const DOMAIN_NUMBER: number = 0xFF00;export default class MigrationAbility extends UIAbility {d_object?: distributedDataObject.DataObject;handleDistributedData(want: Want) {// ...// 创建一个各属性为空的资产对象let attachment: commonType.Asset = {name: '',uri: '',path: '',createTime: '',modifyTime: '',size: '',}// 使用该空资产对象创建分布式数据对象,其余基础属性可以直接使用undefinedlet source: SourceObject = new SourceObject(undefined, undefined, undefined, undefined, attachment);this.d_object = distributedDataObject.create(this.context, source);this.d_object.on("status", (sessionId: string, networkId: string, status: 'online' | 'offline' | 'restored') => {if (status == 'restored') {// 收到监听的restored回调,表示分布式资产对象同步完成hilog.info(DOMAIN_NUMBER, TAG, "restored attachment:" + JSON.stringify(this.d_object['attachment']));}});// ...}
}

若应用想要同步多个资产,可采用两种方式实现:

可将每个资产作为分布式数据对象的一个根属性实现,适用于要迁移的资产数量固定的场景。
可以将资产数组传化为Object传递,适用于需要迁移的资产个数会动态变化的场景(如用户选择了不定数量的图片)。当前不支持直接将资产数组作为根属性传递。
其中方式1的实现可以直接参照添加一个资产的方式添加更多资产。方式2的示例如下所示:

// 导入模块
import { distributedDataObject, commonType } from '@kit.ArkData';
import { UIAbility } from '@kit.AbilityKit';// 数据对象定义
class SourceObject {name: string | undefinedassets: Object | undefined  // 分布式数据对象的中添加一个Object属性constructor(name: string | undefined, assets: Object | undefined) {this.name = namethis.assets = assets;}
}// 该函数用于将资产数组转为Record
GetAssetsWrapper(assets: commonType.Assets): Record<string, commonType.Asset> {let wrapper: Record<string, commonType.Asset> = {}let num: number = assets.length;for (let i: number = 0; i < num; i++) {wrapper[`asset${i}`] = assets[i];}return wrapper;
}export default class MigrationAbility extends UIAbility {d_object?: distributedDataObject.DataObject;async onContinue(wantParam: Record<string, Object>): AbilityConstant.OnContinueResult {// ...// 创建了多个资产对象let attachment1: commonType.Asset = {// ...}let attachment2: commonType.Asset = {// ...}// 将资产对象插入资产数组let assets: commonType.Assets = [];assets.push(attachment1);assets.push(attachment2);// 将资产数组转为Record Object,并用于创建分布式数据对象let assetsWrapper: Object = this.GetAssetsWrapper(assets);let source: SourceObject = new SourceObject("jack", assetsWrapper);this.d_object = distributedDataObject.create(this.context, source);// ...
}

本文主要引用HarmonyOS官方文档


http://www.ppmy.cn/devtools/146170.html

相关文章

C++ 环境搭建 - 安装编译器、IDE选择

引言 C 是一种功能强大且广泛应用的编程语言&#xff0c;适用于系统编程、游戏开发、嵌入式系统等多个领域。为了开始学习和使用 C&#xff0c;首先需要搭建一个合适的开发环境。本文将详细介绍如何安装 C 编译器以及选择适合的集成开发环境&#xff08;IDE&#xff09;&#…

linux-23 文件管理(一)创建文件touch,stat

那接下来看看文件的创建和删除&#xff0c;那我们怎么去创建一个文件&#xff1f;各种方式都能实现&#xff0c;当然&#xff0c;这里先说一说&#xff0c;就像mkdir创建空目录一样&#xff0c;我们如何创建一个空文件&#xff1f;创建空文件其实很简单&#xff0c;有一个命令歪…

sentinel笔记10- 限流规则持久化(下)

上一篇整理过单向的持久化&#xff0c;sentinel笔记9- 限流规则持久化&#xff08;上&#xff09;-CSDN博客 本篇进行sentinel 改造&#xff0c;实现双向同步。 1 下载Sentinel源码 https://github.com/alibaba/Sentinel 2 dashboard 改造 2.1修改dashboard项目的pom.xml &…

抖音生活服务商系统源码怎么搭建?

随着抖音在本地生活服务市场的势头日渐迅猛&#xff0c;抖音生活服务商所拥有的广阔市场前景和巨大收益潜力也开始不断显现&#xff0c;而这也让不少创业者都产生了入局的想法&#xff0c;并纷纷从各个渠道打听起了抖音生活服务商怎么申请的消息。 毕竟&#xff0c;综合抖音官方…

IPv4地址表示法详解

在TCP/IP协议中&#xff0c;IP地址是一个最基本的概念&#xff0c;本文就来参考《计算机网络》谢希仁 这本书&#xff0c;总结一下IPv4地址表示法的发展阶段&#xff0c;做个读书笔记。 IP地址的编址方法共经过了三个历史阶段&#xff1a; 分类的IP地址&#xff0c;这是最基本…

【uniapp】支付宝付款成功后怎么调回自定义页面

以H5为例&#xff08;其实兼容app&#xff09; 1、uniapp跳转第三方链接&#xff0c;新建一个a.vue // actionUrl为第三方链接&#xff08;例如后端返回的支付宝链接&#xff09; <template><view><web-view :src"actionUrl"></web-view>&l…

7-1求逆序对数目

目录 题目描述 输入样例: 输出样例: 逆序对的含义&#xff1a; 具体思路&#xff1a; 归并排序&#xff1a; 求逆序对&#xff1a; 代码实现&#xff1a; 对于mid-z1举个例子 题目描述 注意&#xff1a;本问题算法的时间复杂度要求为O(nlogn), 否则得分无效 题目来源&#xff…

【Java 代码审计入门-02】SQL 漏洞原理与实际案例介绍

SQL注入漏洞全解析 发布日期&#xff1a;2024年12月26日 引言 在互联网的快速发展的今天&#xff0c;Web应用的安全性变得越来越重要。SQL注入&#xff08;SQL Injection, 简称SQLi&#xff09;作为最常见的Web安全漏洞之一&#xff0c;给无数网站和应用程序带来了巨大的风险…