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

ops/2024/12/28 11:37:40/

文件资产迁移,对于图片、文档等文件类数据,需要先将其转换为资产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/ops/145644.html

相关文章

linux内核如何实现TCP的?

TCP(传输控制协议)是网络通信中的核心协议之一,实现了可靠的、面向连接的、基于字节流的通信。在Linux内核中,TCP的实现相对复杂,涉及多个模块和层次。以下是一些关键概念和机制: 1. 协议栈 Linux 内核中的网络协议栈(Network Stack)是分层设计的,包括链路层、网络层…

信号仿真高级工程师面试题

信号仿真高级工程师面试题可能涵盖多个方面,旨在全面评估应聘者的专业知识、技能水平、实践经验和问题解决能力。以下是一些可能的面试题及其简要解析: 一、专业知识与技能 描述你对信号仿真的理解 考察点:对信号仿真基本概念、原理及应用的掌握程度。参考答案:信号仿真是…

Hadoop集群(HDFS集群、YARN集群、MapReduce​计算框架)

一、 简介 Hadoop主要在分布式环境下集群机器&#xff0c;获取海量数据的处理能力&#xff0c;实现分布式集群下的大数据存储和计算。 其中三大核心组件: HDFS存储分布式文件存储、YARN分布式资源管理、MapReduce分布式计算。 二、工作原理 2.1 HDFS集群 Web访问地址&…

通过交叉实现数据触底分页效果new IntersectionObserver()(html、react、vue2、vue3)中使用

react中用法 import React, { useState, useEffect, useRef } from react;const InfiniteScroll () > {const [items, setItems] useState([]);const [loading, setLoading] useState(false);const [page, setPage] useState(1);const loaderRef useRef(null);// 模拟…

FreeType矢量字符库的介绍、交叉编译以及安装

FreeType矢量字符库的介绍 FreeType 是一个开源的跨平台字体引擎库&#xff0c;广泛用于 Linux 嵌入式系统中实现字符显示的功能。它提供了高效的 TrueType、OpenType 和其他字体格式的解析和渲染功能&#xff0c;在嵌入式开发中尤其适合用来绘制矢量字体和位图字体。 FreeTy…

全面Kafka监控方案:从配置到指标

文章目录 1.1.监控配置1.2.监控工具1.3.性能指标系统相关指标GC相关指标JVM相关指标Topic相关指标Broker相关指标 1.4.性能指标说明1.5.重要指标说明 1.1.监控配置 开启JMX服务端口&#xff1a;kafka基本分为broker、producer、consumer三个子项&#xff0c;每一项的启动都需要…

`we_chat_union_id IS NOT NULL` 和 `we_chat_union_id != ‘‘` 这两个条件之间的区别

文章目录 1、什么是空字符串&#xff1f;2、两个引号之间加上空格 好的&#xff0c;我们来详细解释一下 we_chat_union_id IS NOT NULL 和 we_chat_union_id ! 这两个条件之间的区别&#xff0c;以及它们在 SQL 查询中的作用&#xff1a; 1. we_chat_union_id IS NOT NULL 含…

计算机的错误计算(一百九十三)

摘要 用两个大模型化简计算 其中有关数字取弧度&#xff0c;结果保留5位有效数字。一个大模型进行了一次化简&#xff0c;另外一个大模型没有化简。两个大模型​​​​​均给出错误结果。 例1. 化简计算 其中有关数字取弧度&#xff0c;结果保留5位有效数字。 下面是与一个…