OpenHarmony数据管理核心技术:UTD、UDS与UDMF深度剖析
目录
-
概述
-
1. 标准化数据定义与描述
- 1.1 标准化数据类型 (UTD)
- UTD的设计原则
- UTD的定义
- 预置数据类型
- 应用自定义数据类型
- 接口说明
- 代码示例
- 1.2 标准化数据结构 (UDS)
- UDS的设计原则
- UDS的组成
- 预置数据结构
- 应用自定义数据结构
- 常见数据结构
- 1.1 标准化数据类型 (UTD)
-
2. 数据共享机制
- 2.1 DataShareExtensionAbility
- 运作机制
- 数据提供方开发步骤
- 数据访问方开发步骤
- 接口说明
- 2.2 静默访问
- 运作机制
- 支持的数据类型
- URI格式
- 开发步骤
- 接口说明
- 2.1 DataShareExtensionAbility
-
3. 标准化数据通路 (UDMF)
- 3.1 概述
- 3.2 设计目标
- 3.3 UDMF组成
- 3.4 数据通路类型
- 3.5 URI标识
- 3.6 数据提供方开发
- 3.7 数据访问方开发
-
4. 跨设备数据同步
- 4.1 概述
- 4.2 同步机制与策略
- 4.3 一致性模型
- 4.4 分布式数据库同步
- 4.5 数据同步配置
- 4.6 同步事件监听
- 4.7 访问控制机制
-
5. 开发接口与示例
- 5.1 ArkTS接口
- 5.2 C/C++接口
-
结语
概述
OpenHarmony提供了全面的数据管理解决方案,包括跨应用数据共享、跨设备数据同步、标准化数据定义与描述等功能。本文档汇总了OpenHarmony中数据管理的核心技术组件和实现方式,帮助开发者了解和使用这些功能。
1. 标准化数据定义与描述
1.1 标准化数据类型 (UTD)
标准化数据类型(Uniform Type Descriptor,简称UTD)旨在解决数据类型描述的歧义问题。例如,JPEG图片可能被描述为image/jpeg、.jpg、.jpeg或image/picture等不同形式,导致跨系统传输时,接收方需依赖复杂的兼容逻辑才能识别数据类型。
UTD的设计原则
- 层级结构:基于MIME Type或文件后缀名构建层级结构,描述不同类型间的兼容与继承关系
- 分类原则:
- 物理分类:根节点为general.entity,用于描述类型的物理属性
- 逻辑分类:根节点为general.object,用于描述类型的功能性特征
UTD的定义
UTD由以下属性组成:
- typeId:数据类型的唯一标识符,由应用bundleName + 具体类型名组成
- description:数据类型的描述信息
- icon:数据类型的图标资源
- isSystemType:是否为系统预置类型
- belongingToTypes:所属的父类型列表
- filenameExtensions:关联的文件后缀名列表
- mimeTypes:关联的MIME类型列表
预置数据类型
系统预置了常用的标准化数据类型,包括:
- 基础类型:如general.entity、general.object、general.file等
- 媒体类型:如general.image、general.audio、general.video等
- 具体格式:如general.png、general.jpeg、general.mp3等
应用自定义数据类型
开发者可以创建自定义数据类型,需满足以下约束:
- TypeId:由应用bundleName + 具体类型名组成
- BelongingToTypes:必须为已存在的数据类型
- FilenameExtensions和MIMETypes:可选,用于关联文件后缀和MIME类型
工作原理
应用自定义数据类型的工作流程如下:
- 应用通过API注册自定义数据类型
- 系统验证数据类型的合法性
- 数据类型被添加到UTD系统中
- 其他应用可以通过API查询和使用这些数据类型
约束限制
- 应用自定义数据类型的typeId必须以应用的bundleName为前缀
- 每个应用最多可注册100个自定义数据类型
- 自定义数据类型不能与系统预置类型重复
- BelongingToTypes必须为已存在的数据类型
开发步骤
- 导入uniformTypeDescriptor模块
- 定义自定义数据类型
- 调用registerUniformDataType接口注册数据类型
- 使用getUniformDataType接口验证注册结果
接口说明
以下是UTD相关的主要接口:
| 接口名称 | 描述 |
|---|---|
| belongsTo(typeId: string, belongingToTypeId: string): boolean | 判断一个数据类型是否属于另一个数据类型 |
| getUniformDataType(typeId: string): UniformDataType | 获取指定数据类型的详细信息 |
| getUniformDataTypesByFilenameExtension(filenameExtension: string): Array | 通过文件后缀获取对应的数据类型列表 |
| getUniformDataTypesByMimeType(mimeType: string): Array | 通过MIME类型获取对应的数据类型列表 |
| getUniformDataTypeFilenameExtensions(typeId: string): Array | 获取指定数据类型关联的文件后缀列表 |
| getUniformDataTypeMimeTypes(typeId: string): Array | 获取指定数据类型关联的MIME类型列表 |
| registerUniformDataType(typeInfo: UniformDataType): void | 注册自定义数据类型 |
| unregisterUniformDataType(typeId: string): void | 注销自定义数据类型 |
代码示例
示例1:查询媒体类文件的归属关系
import uniformTypeDescriptor from '@ohos.data.uniformTypeDescriptor';// 判断JPEG图片是否属于图片类型
let isImage = uniformTypeDescriptor.belongsTo('general.jpeg', 'general.image');
console.log('JPEG is image: ' + isImage); // 输出: true// 判断MP3文件是否属于图片类型
let isImage2 = uniformTypeDescriptor.belongsTo('general.mp3', 'general.image');
console.log('MP3 is image: ' + isImage2); // 输出: false
示例2:通过文件后缀获取数据类型
import uniformTypeDescriptor from '@ohos.data.uniformTypeDescriptor';// 获取.jpg文件对应的数据类型
let jpegTypes = uniformTypeDescriptor.getUniformDataTypesByFilenameExtension('.jpg');
console.log('JPEG types: ' + JSON.stringify(jpegTypes));// 获取.png文件对应的数据类型
let pngTypes = uniformTypeDescriptor.getUniformDataTypesByFilenameExtension('.png');
console.log('PNG types: ' + JSON.stringify(pngTypes));
示例3:通过MIME类型获取数据类型
import uniformTypeDescriptor from '@ohos.data.uniformTypeDescriptor';// 获取image/jpeg MIME类型对应的数据类型
let jpegTypes = uniformTypeDescriptor.getUniformDataTypesByMimeType('image/jpeg');
console.log('JPEG MIME types: ' + JSON.stringify(jpegTypes));// 获取image/png MIME类型对应的数据类型
let pngTypes = uniformTypeDescriptor.getUniformDataTypesByMimeType('image/png');
console.log('PNG MIME types: ' 