目录
概述
1. 标准化数据定义与描述
1.1 标准化数据类型 (UTD)
UTD的设计原则UTD的定义预置数据类型应用自定义数据类型接口说明代码示例 1.2 标准化数据结构 (UDS)
UDS的设计原则UDS的组成预置数据结构应用自定义数据结构常见数据结构
2. 数据共享机制
2.1 DataShareExtensionAbility
运作机制数据提供方开发步骤数据访问方开发步骤接口说明 2.2 静默访问
运作机制支持的数据类型URI格式开发步骤接口说明
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: ' + JSON.stringify(pngTypes));
示例4:注册自定义数据类型
import uniformTypeDescriptor from '@ohos.data.uniformTypeDescriptor';
// 定义自定义数据类型
let customType = {
typeId: 'com.example.app.customType',
description: '自定义数据类型',
icon: '',
isSystemType: false,
belongingToTypes: ['general.file'],
filenameExtensions: ['.custom'],
mimeTypes: ['application/custom']
};
try {
// 注册自定义数据类型
uniformTypeDescriptor.registerUniformDataType(customType);
console.log('Custom type registered successfully');
// 验证注册结果
let typeInfo = uniformTypeDescriptor.getUniformDataType('com.example.app.customType');
console.log('Custom type info: ' + JSON.stringify(typeInfo));
} catch (error) {
console.error('Failed to register custom type: ' + error);
}
1.2 标准化数据结构 (UDS)
标准化数据结构(Unified Data Structure,简称UDS)针对部分标准化数据类型定义了统一的数据内容结构,明确了对应的描述信息。应用间使用标准化数据结构进行数据交互后,将遵从统一的解析标准。
UDS的设计原则
结构统一:定义统一的数据结构,减少数据转换的复杂性类型安全:基于UTD实现类型安全的数据交换扩展性:支持自定义数据结构,满足不同应用的需求
UDS的组成
UDS由以下部分组成:
数据类型:基于UTD的数据类型标识数据内容:实际的数据内容元数据:描述数据的附加信息
预置数据结构
系统预置了常用的标准化数据结构,包括:
基础结构:如文本、数字、布尔值等媒体结构:如图片、音频、视频等文档结构:如文本文档、电子表格、演示文稿等
应用自定义数据结构
开发者可以创建自定义数据结构,需满足以下约束:
必须基于已存在的UTD类型结构定义必须符合JSON Schema规范自定义结构不能与系统预置结构冲突
常见数据结构
以下是OpenHarmony中常见的标准化数据结构:
1. 文本数据结构
interface Text {
textContent: string; // 文本内容
abstract: string; // 文本摘要
title: string; // 文本标题
}
2. 图片数据结构
interface Image {
imageUri: string; // 图片URI
abstract: string; // 图片摘要
title: string; // 图片标题
pixelWidth: number; // 像素宽度
pixelHeight: number; // 像素高度
}
3. 音频数据结构
interface Audio {
audioUri: string; // 音频URI
abstract: string; // 音频摘要
title: string; // 音频标题
duration: number; // 时长(毫秒)
}
4. 视频数据结构
interface Video {
videoUri: string; // 视频URI
abstract: string; // 视频摘要
title: string; // 视频标题
duration: number; // 时长(毫秒)
pixelWidth: number; // 像素宽度
pixelHeight: number; // 像素高度
}
5. 文件数据结构
interface File {
fileUri: string; // 文件URI
abstract: string; // 文件摘要
title: string; // 文件标题
size: number; // 文件大小(字节)
lastModified: number; // 最后修改时间
}
6. 链接数据结构
interface Link {
url: string; // 链接URL
description: string; // 链接描述
title: string; // 链接标题
}
7. 应用数据结构
interface Application {
appId: string; // 应用ID
appName: string; // 应用名称
appIcon: string; // 应用图标URI
description: string; // 应用描述
}
多样式数据
多样式数据概念允许同一记录存在不同的表达形式(样式),丰富了数据的表现形式。在交互过程中,数据提供方提供记录的不同数据样式,数据使用方根据业务需要从记录中获取样式数据。
2. 数据共享机制
OpenHarmony提供了多种数据共享机制,满足不同场景下的数据共享需求。
2.1 通过DataShareExtensionAbility实现数据共享
DataShareExtensionAbility是一种基于Extension机制的数据共享方式,适用于需要复杂交互和权限控制的数据共享场景。
运作机制
DataShareExtensionAbility的运作机制如下:
数据提供方:通过实现DataShareExtensionAbility暴露数据接口数据访问方:通过DataShareHelper接口访问数据系统管理:系统负责权限管理和数据路由
数据提供方开发步骤
创建DataShareExtensionAbility
创建继承自DataShareExtensionAbility的类实现必要的数据操作接口
配置权限
在module.json5中声明所需权限配置数据访问权限
实现数据操作
实现insert、update、delete、query等数据操作处理数据类型转换和验证
数据访问方开发步骤
获取DataShareHelper
通过createDataShareHelper获取数据访问对象配置访问参数和权限
执行数据操作
调用insert、update、delete、query等方法处理返回结果和异常
接口说明
以下是DataShareExtensionAbility相关的主要接口:
| 接口名称 | 描述 |
|---|---|
| createDataShareHelper(context: Context, uri: string, callback: AsyncCallback): void | 创建DataShareHelper对象 |
| insert(uri: string, value: ValuesBucket, callback: AsyncCallback): void | 插入数据 |
| update(uri: string, predicates: DataSharePredicates, value: ValuesBucket, callback: AsyncCallback): void | 更新数据 |
| delete(uri: string, predicates: DataSharePredicates, callback: AsyncCallback): void | 删除数据 |
| query(uri: string, predicates: DataSharePredicates, columns: Array, callback: AsyncCallback): void | 查询数据 |
2.2 通过静默访问实现数据共享
静默访问是一种简化的数据共享方式,适用于不需要复杂交互的数据共享场景。
静默访问机制
静默访问机制如下:
数据提供方:通过DataShareService暴露数据数据访问方:通过静默访问接口直接访问数据系统管理:系统负责权限管理和数据路由
数据类型
持久化数据:
归属于数据提供方的数据库存储于数据提供方的沙箱按表为粒度配置为可以被其他应用访问的数据表适用于数据格式类似关系型数据库的相关场景
过程数据:
托管在数据管理服务上的过程数据存储于数据管理服务的沙箱格式为json或byte数据无人订阅10天后自动删除适用于数据有时效性且数据格式较简单的相关场景
URI格式
静默访问的URI需严格按照如下格式:
datashareproxy://{bundleName}/{dataPath}
支持添加参数:
datashareproxy://{bundleName}/{dataPath}?{arg1}&{arg2}
静默访问开发步骤
配置数据提供方
在module.json5中声明数据共享能力配置数据访问权限
实现数据操作
实现数据存储和访问逻辑处理数据类型转换和验证
访问数据
通过静默访问接口访问数据处理返回结果和异常
接口说明
以下是静默访问相关的主要接口:
| 接口名称 | 描述 |
|---|---|
| silentAccess(uri: string, callback: AsyncCallback): void | 静默访问数据 |
| batchInsert(uri: string, values: Array, callback: AsyncCallback): void | 批量插入数据 |
| batchUpdate(uri: string, predicates: DataSharePredicates, values: Array, callback: AsyncCallback): void | 批量更新数据 |
| batchDelete(uri: string, predicates: Array, callback: AsyncCallback): void | 批量删除数据 |
数据类型支持
静默访问支持以下数据类型:
基础类型:字符串、数字、布尔值等媒体类型:图片、音频、视频等文档类型:文本文档、电子表格等自定义类型:基于UTD的自定义数据类型
3. 标准化数据通路
标准化数据通路(Unified Data Management Framework,简称UDMF)提供了一套统一的数据交换机制,支持不同应用间的数据共享和传递。
3.1 UDMF概述
UDMF是一个公共数据通路,定义了数据的统一格式和交换协议,简化了应用间的数据共享过程。
UDMF的设计目标
数据格式统一:定义统一的数据格式,减少数据转换的复杂性交换协议标准:提供标准的数据交换协议,确保数据传输的可靠性类型安全:基于UTD实现类型安全的数据交换跨应用支持:支持不同应用间的数据共享和传递
UDMF的组成
UDMF由以下部分组成:
数据提供方:提供数据的应用或服务数据访问方:访问数据的应用或服务数据通路:负责数据传输和转换的中间层类型系统:基于UTD的数据类型系统
3.2 数据通路类型
当前UDMF中的跨应用数据共享通路有:公共数据通路
公共数据通路:应用共享的公用数据共享通路,所有应用均可向通路中写入数据,写入方可以根据写入数据时生成的数据唯一标识符进行数据的更新、删除、指定数据标识符进行查询、全量查询。
3.3 URI标识
统一数据对象UnifiedData在UDMF数据通路中具有全局唯一URI标识,其定义为:
udmf://intention/bundleName/groupId
其中:
udmf: 协议名,表示使用UDMF提供的数据通路intention: UDMF已经支持的数据通路类型枚举值,对应不同的业务场景bundleName: 数据来源应用的包名称groupId: 分组名称,支持批量数据分组管理
3.4 开发步骤
数据提供方
导入相关模块创建统一数据对象并插入到UDMF的公共数据通路中更新已插入的统一数据对象删除存储在UDMF公共数据通路中的统一数据对象
数据插入
import unifiedDataChannel from '@ohos.data.unifiedDataChannel';
// 创建统一数据对象
let unifiedData = new unifiedDataChannel.UnifiedData();
let records = new unifiedDataChannel.UnifiedRecords();
// 添加文本记录
let textRecord = new unifiedDataChannel.Text();
textRecord.textContent = 'Hello World';
records.push(textRecord);
// 添加图片记录
let imageRecord = new unifiedDataChannel.Image();
imageRecord.imageUri = 'file:///data/storage/el2/base/haps/entry/files/image.jpg';
records.push(imageRecord);
// 设置记录到统一数据对象
unifiedData.setRecords(records);
// 插入数据
unifiedDataChannel.insert(unifiedData, (err, data) => {
if (err) {
console.error('Failed to insert data: ' + err);
return;
}
console.log('Data inserted successfully: ' + data);
});
数据更新
// 更新数据
let updateData = new unifiedDataChannel.UnifiedData();
let updateRecords = new unifiedDataChannel.UnifiedRecords();
let updateTextRecord = new unifiedDataChannel.Text();
updateTextRecord.textContent = 'Updated Hello World';
updateRecords.push(updateTextRecord);
updateData.setRecords(updateRecords);
unifiedDataChannel.update(updateData, (err, data) => {
if (err) {
console.error('Failed to update data: ' + err);
return;
}
console.log('Data updated successfully: ' + data);
});
数据删除
// 删除数据
unifiedDataChannel.delete((err, data) => {
if (err) {
console.error('Failed to delete data: ' + err);
return;
}
console.log('Data deleted successfully: ' + data);
});
数据访问方
导入相关模块查询存储在UDMF公共数据通路中的全量统一数据对象根据业务需要从记录中获取样式数据
数据查询
import unifiedDataChannel from '@ohos.data.unifiedDataChannel';
// 查询数据
unifiedDataChannel.query((err, data) => {
if (err) {
console.error('Failed to query data: ' + err);
return;
}
// 处理查询结果
let records = data.getRecords();
for (let i = 0; i < records.length; i++) {
let record = records[i];
if (record.getType() === unifiedDataChannel.UnifiedDataType.TEXT) {
let textRecord = record;
console.log('Text content: ' + textRecord.textContent);
} else if (record.getType() === unifiedDataChannel.UnifiedDataType.IMAGE) {
let imageRecord = record;
console.log('Image URI: ' + imageRecord.imageUri);
}
}
});
数据类型过滤
// 按数据类型查询
let options = {
dataTypes: [unifiedDataChannel.UnifiedDataType.TEXT]
};
unifiedDataChannel.query(options, (err, data) => {
if (err) {
console.error('Failed to query data: ' + err);
return;
}
// 处理查询结果
let records = data.getRecords();
for (let i = 0; i < records.length; i++) {
let record = records[i];
let textRecord = record;
console.log('Text content: ' + textRecord.textContent);
}
});
4. 跨设备数据同步
OpenHarmony提供了跨设备数据同步能力,支持数据在不同设备间的同步和共享。
4.1 跨设备数据同步概述
跨设备数据同步允许应用在多个设备间同步数据,确保数据的一致性和可用性。
同步机制
分布式数据库:基于分布式数据库实现数据同步事件驱动:通过事件机制触发数据同步冲突解决:提供冲突检测和解决机制增量同步:支持增量数据同步,提高同步效率
同步策略
实时同步:数据变化时立即同步定时同步:按设定时间间隔同步按需同步:应用主动触发同步条件同步:满足特定条件时同步
4.2 数据类型
根据跨设备同步数据生命周期的不同,可以分为:
临时数据:生命周期较短,通常保存到内存中,建议使用分布式数据对象持久数据:生命周期较长,需要保存到存储的数据库中
关系型数据库:适用于有复杂关系的数据,如图库应用的各种相册、封面、图片等属性信息键值型数据库:适用于简单的键值对数据,如图库应用的具体图片缩略图
4.3 一致性模型
分布式数据库一致性可以分为:
强一致性:某一设备成功增、删、改数据后,组网内任意设备可立即读取数据获得更新后的值弱一致性:某一设备成功增、删、改数据后,组网内设备可能读取到本次更新后的数据,也可能读取不到最终一致性:某一设备成功增、删、改数据后,组网内设备可能读取不到本次更新后的数据,但在某个时间窗口之后组网内设备的数据能够达到一致状态
由于移动终端设备具有不常在线且无中心的特点,同应用跨设备数据同步仅支持最终一致性。
4.4 分布式数据库同步
分布式数据库是跨设备数据同步的核心组件,提供了数据的分布式存储和访问能力。
分布式数据库特点
数据分布:数据分布在多个设备上一致性保证:保证数据的一致性高可用性:提供高可用的数据访问容错能力:具备故障恢复能力
分布式数据库使用
import distributedData from '@ohos.data.distributedData';
// 创建分布式数据库配置
let config = {
name: 'distributed_db',
securityLevel: distributedData.SecurityLevel.S1
};
// 获取分布式数据库
distributedData.createKVManager(config, (err, manager) => {
if (err) {
console.error('Failed to create KV manager: ' + err);
return;
}
// 创建分布式数据库
let options = {
createIfMissing: true,
encrypt: false,
backup: false,
autoSync: true,
kvStoreType: distributedData.KVStoreType.SINGLE_VERSION
};
manager.getKVStore('distributed_store', options, (err, store) => {
if (err) {
console.error('Failed to get KV store: ' + err);
return;
}
// 写入数据
store.put('key1', 'value1', (err) => {
if (err) {
console.error('Failed to put data: ' + err);
return;
}
console.log('Data put successfully');
});
// 读取数据
store.get('key1', (err, data) => {
if (err) {
console.error('Failed to get data: ' + err);
return;
}
console.log('Data retrieved: ' + data);
});
});
});
4.5 数据同步配置
数据同步配置用于控制数据同步的行为和策略。
同步配置参数
| 参数名 | 类型 | 描述 |
|---|---|---|
| autoSync | boolean | 是否自动同步 |
| syncRetryTimes | number | 同步重试次数 |
| syncRetryInterval | number | 同步重试间隔 |
| syncAllowedNetworkTypes | Array | 允许同步的网络类型 |
同步配置示例
// 配置同步参数
let syncOptions = {
autoSync: true,
syncRetryTimes: 3,
syncRetryInterval: 1000,
syncAllowedNetworkTypes: ['WIFI', 'CELLULAR']
};
// 应用同步配置
store.setSyncOptions(syncOptions, (err) => {
if (err) {
console.error('Failed to set sync options: ' + err);
return;
}
console.log('Sync options set successfully');
});
4.6 同步事件监听
应用可以监听数据同步事件,以便在数据变化时做出响应。
事件监听示例
// 注册数据变化监听器
store.on('dataChange', distributedData.SubscribeType.SUBSCRIBE_TYPE_REMOTE, (data) => {
console.log('Data changed: ' + JSON.stringify(data));
// 处理数据变化
for (let i = 0; i < data.length; i++) {
let entry = data[i];
console.log('Key: ' + entry.key + ', Value: ' + entry.value);
}
});
// 注册同步完成监听器
store.on('syncComplete', (data) => {
console.log('Sync completed: ' + JSON.stringify(data));
// 处理同步结果
for (let i = 0; i < data.length; i++) {
let result = data[i];
console.log('Device ID: ' + result.deviceId + ', Status: ' + result.status);
}
});
4.7 访问控制机制
数据跨设备同步时,数据管理基于设备等级和数据安全标签进行访问控制,确保数据安全。
5. 开发接口与示例
5.1 ArkTS接口
OpenHarmony提供了丰富的ArkTS接口,包括:
标准化数据类型相关接口:标准化数据结构相关接口:
@ohos.data.uniformTypeDescriptor统一数据通道相关接口:
@ohos.data.uniformDataStruct数据共享相关接口:
@ohos.data.unifiedDataChannel
@ohos.data.dataShare
5.2 C/C++接口
对于需要使用C/C++开发的场景,OpenHarmony也提供了相应的NDK接口:
UTD相关接口:系列函数UDS相关接口:
OH_Utd_*系列函数UDMF相关接口:
OH_Uds_*系列函数
OH_Udmf_*
结语
OpenHarmony的数据管理功能为开发者提供了全面的数据共享和同步解决方案。通过合理使用这些功能,开发者可以构建出强大的跨应用、跨设备数据交互应用,提升用户体验和应用价值。希望本文档能够帮助开发者更好地理解和使用OpenHarmony的数据管理功能。

















暂无评论内容