From b261a291242e01eb79fa37d1427bed21d419bc04 Mon Sep 17 00:00:00 2001 From: dboy190 Date: Sat, 15 Jul 2023 19:57:35 +0800 Subject: [PATCH] fix review problem 1 Signed-off-by: dboy190 --- .../database/data-share-overview.md | 41 +++------ .../database/figures/udmf_architecture.png | Bin 53496 -> 0 bytes .../database/unified-data-channels.md | 85 +++++++++++++----- .../database/unified-data-definition.md | 50 +++++------ 4 files changed, 96 insertions(+), 80 deletions(-) delete mode 100644 zh-cn/application-dev/database/figures/udmf_architecture.png diff --git a/zh-cn/application-dev/database/data-share-overview.md b/zh-cn/application-dev/database/data-share-overview.md index f8ecdbc184..40507e0dcf 100644 --- a/zh-cn/application-dev/database/data-share-overview.md +++ b/zh-cn/application-dev/database/data-share-overview.md @@ -2,11 +2,11 @@ ## 功能简介 -数据共享提供了向其他应用共享以及管理其数据的方法,支持不同应用之间的数据协同。 +跨应用数据共享提供了向其他应用共享以及管理其数据的方法,支持不同应用之间的数据协同。 在许多应用场景中都需要用到数据共享,比如将电话簿、短信、媒体库中的数据共享给其他应用等。当然,不是所有的数据都允许其他应用访问,比如帐号、密码等;有些数据也只允许其他应用查询而不允许其删改,比如短信等。所以针对不同数据共享场景以及数据隐私保护,设计一个安全、便捷的跨应用数据共享机制是十分必要的。 -当前,基于跨应用数据共享中涉及的应用个数的不同情况,数据管理提供支持一对多跨应用数据共享和多对多跨应用数据共享的能力。 +当前,基于跨应用数据共享中涉及的数据提供方应用个数的不同情况,数据管理提供支持一对多跨应用数据共享和多对多跨应用数据共享的能力。 ## 基本概念 @@ -25,14 +25,15 @@ ## 标准化数据定义 当出现多应用数据共享时,每个应用都有自己的数据定义和数据格式,应用间的的数据交互需做大量的数据格式适配工作。为了降低应用/业务数据交互成本,我们提出标准化数据定义作为OpenHarmony统一的数据语言, -构建OpenHarmony数据跨应用、跨设备交互标准。 +构建OpenHarmony数据跨应用交互标准。 标准化数据定义统一定义了多种常用的数据类型,应用可以使用统一数据管理框架提供的接口创建和使用这些标准化数据类型,具体内容及使用请见[标准化数据定义](unified-data-definition.md)。 ## 一对多跨应用数据共享 + 基于跨应用一对多数据共享的场景,可通过DataShare实现。DataShare实现数据共享时,包括数据提供方和数据访问方,基于跨应用数据共享是否拉起数据提供方的不同情况,支持两种不同的实现方式。具体相关实现可见下文。 -## 具体实现 +### 具体实现 数据提供方无需进行繁琐的封装,可直接使用DataShare向其他应用共享数据;对数据访问方来说,因DataShare的访问方式不会因数据提供的方式而不同,只需要学习和使用一套接口即可,大大减少了学习时间和开发难度。 @@ -62,32 +63,12 @@ DataShare实现跨应用数据共享有两种方式: ## 多对多跨应用数据共享 -区别于一对多数据共享,当多个应用之间需要相互进行数据共享时,即多对多的跨应用数据共享场景下,对于数据的定义、流通和权限管理等是十分必要的。统一数据管理框架(Unified Data Management Framework, UDMF) -即提供一种新的数据共享与交互方式,可以实现多对多跨应用数据共享。 - -应用可以根据UDMF提供的标准化接口,将数据写入UDMF不同的数据共享通道,并提供多应用进行读取。写入UDMF中的数据依据应用定义的权限、数据通道定义的权限以及整个UDMF框架定义的权限管理逻辑进行管理, -写入通道中的数据的生命周期的管理也遵循上述逻辑。这样离散在各个应用的碎片化数据可以在UDMF的不同通道中形成聚合效应,提升开发者跨应用数据协同的效率,同时提升用户的数据体验。 - -具体实现与指导,可见[通过标准化数据通路实现数据共享](unified-data-channels.md) - -### 通过标准化数据通路实现数据共享 - -同时,UDMF提供安全、标准化数据通路,支持标准化数据接入与读取,降低业务跨应用数据交互成本。 +区别于一对多数据共享只有一个数据提供方,当多个应用之间需要相互进行数据共享时,即多对多的跨应用数据共享场景下,对于数据的定义、流通和权限管理等是十分必要的。 +统一数据管理框架(Unified Data Management Framework, UDMF)即提供一种新的数据共享与交互方式,可以实现多对多跨应用数据共享,具体相关实现可见下文。 -UDMF中数据通路以及通路中数据统一管理的URI定义为udmf://intension/bundleName/groupName/guid,其中各组成部分的含义分别为: -**udmf:** 协议名,表示使用UDMF提供的数据通路。 +### 具体实现 -**intension:** 通道分类,对应不同的业务场景(如数据拖拽)。 +[通过标准化数据通路实现数据共享](unified-data-channels.md) -**bundleName:** 数据来源应用的包名称。 - -**groupName:** 分组名称,支持批量数据分组管理。 - -**guid:** 系统生成的数据id,全局唯一。 - -当前UDMF中的跨应用数据共享通道有: - -- **拖拽数据共享通道** - -当用户发起拖拽时,应用(数据提供方)可以通过UDMF提供的统一接口将拖拽数据写入到UDMF的拖拽通道中,并由UDMF统一进行数据的管理,包括访问权限、生命周期等。 -同时在完成必要的权限校验后,目标应用(数据访问方)可以通过UDMF提供的标准化接口进行数据的访问。数据被读取后,UDMF会统一对数据的生命周期进行管理。 \ No newline at end of file +应用可以根据UDMF提供的标准化接口,将数据写入UDMF不同的数据共享通道,并提供多应用进行读取。写入UDMF中的数据依据应用定义的权限、数据通道定义的权限以及整个UDMF框架定义的权限管理逻辑进行管理, +写入通道中的数据的生命周期的管理也遵循上述逻辑。这样离散在各个应用的碎片化数据可以在UDMF的不同通道中形成聚合效应,提升开发者跨应用数据协同的效率,同时提升用户的数据体验。 diff --git a/zh-cn/application-dev/database/figures/udmf_architecture.png b/zh-cn/application-dev/database/figures/udmf_architecture.png deleted file mode 100644 index 78281a43dc5debb18f4fec9aee9b1f6816fca429..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53496 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%0AdAE9vU;MPjf5}JeaZgPjw^6I~<2(I+H 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 z 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 { @@ -51,13 +84,13 @@ UDMF定义了安全、标准化的数据接入与读取通路,为各种业务 ``` 3. 更新上一步骤插入的统一数据对象。 - ```js + ```ts let plainText = new UDMF.PlainText(); plainText.textContent = 'hello world!'; let unifiedData = new UDMF.UnifiedData(plainText); let options = { - key: 'udmf://SuperHub/com.ohos.test/0123456789' + key: 'udmf://DataHub/com.ohos.test/0123456789' }; try { @@ -72,17 +105,17 @@ UDMF定义了安全、标准化的数据接入与读取通路,为各种业务 console.error(`Update data throws an exception. code is ${e.code},message is ${e.message} `); } ``` -4. 查询存储在UDMF公共存储中的统一数据对象。 +4. 删除存储在UDMF公共存储中的统一数据对象。 - ```js + ```ts let options = { - intention: UDMF.Intention.SUPER_HUB + intention: UDMF.Intention.DATA_HUB }; try { - UDMF.queryData(options, (err, data) => { + UDMF.deleteData(options, (err, data) => { if (err === undefined) { - console.info(`Succeeded in querying data. size = ${data.length}`); + console.info(`Succeeded in deleting data. size = ${data.length}`); for (let i = 0; i < data.length; i++) { let records = data[i].getRecords(); for (let j = 0; j < records.length; j++) { @@ -93,24 +126,32 @@ UDMF定义了安全、标准化的数据接入与读取通路,为各种业务 } } } else { - console.error(`Failed to query data. code is ${err.code},message is ${err.message} `); + console.error(`Failed to delete data. code is ${err.code},message is ${err.message} `); } }); } catch(e) { - console.error(`Query data throws an exception. code is ${e.code},message is ${e.message} `); + console.error(`Delete data throws an exception. code is ${e.code},message is ${e.message} `); } ``` -5. 删除存储在UDMF公共存储中的统一数据对象。 + +### 数据访问方 + +1. 导入`@ohos.data.UDMF`模块。 + + ```ts + import UDMF from '@ohos.data.UDMF'; + ``` +2. 查询存储在UDMF公共存储中的统一数据对象。 - ```js + ```ts let options = { - intention: UDMF.Intention.SUPER_HUB + intention: UDMF.Intention.DATA_HUB }; try { - UDMF.deleteData(options, (err, data) => { + UDMF.queryData(options, (err, data) => { if (err === undefined) { - console.info(`Succeeded in deleting data. size = ${data.length}`); + console.info(`Succeeded in querying data. size = ${data.length}`); for (let i = 0; i < data.length; i++) { let records = data[i].getRecords(); for (let j = 0; j < records.length; j++) { @@ -121,10 +162,10 @@ UDMF定义了安全、标准化的数据接入与读取通路,为各种业务 } } } else { - console.error(`Failed to delete data. code is ${err.code},message is ${err.message} `); + console.error(`Failed to query data. code is ${err.code},message is ${err.message} `); } }); } catch(e) { - console.error(`Delete data throws an exception. code is ${e.code},message is ${e.message} `); + console.error(`Query data throws an exception. code is ${e.code},message is ${e.message} `); } ``` diff --git a/zh-cn/application-dev/database/unified-data-definition.md b/zh-cn/application-dev/database/unified-data-definition.md index 1114bedaa9..3befd4a63f 100644 --- a/zh-cn/application-dev/database/unified-data-definition.md +++ b/zh-cn/application-dev/database/unified-data-definition.md @@ -3,14 +3,14 @@ ## 场景介绍 -为了构建OpenHarmony数据跨应用、跨设备交互的标准定义,降低应用/业务数据交互成本,促进数据生态建设,UDMF提供了标准化的数据定义,统一定义了多种常用的数据类型。应用可以使用统一数据管理框架提供的接口创建和使用这些标准化数据类型。 +为了构建OpenHarmony数据跨应用交互的标准定义,降低应用/业务数据交互成本,促进数据生态建设,UDMF提供了标准化的数据定义,统一定义了多种常用的数据类型。应用可以使用统一数据管理框架提供的接口创建和使用这些标准化数据类型。 ## 标准化数据类型 UDMF提供的标准化数据类型主要包括以下几类: -**基础数据类型:** File、Text等,能够进行跨应用、跨设备以及平台流转,如图1和图2所示。 +**基础数据类型:** File、Text等,能够进行跨应用与跨平台流转,如图1和图2所示。 **图1** UDMF File数据类型示意图 @@ -20,13 +20,13 @@ UDMF提供的标准化数据类型主要包括以下几类: ![UDMF_TEXT](figures/udmf_type_Text.png) -**系统相关数据类型(System Defined Type, SDT):** 与具体的平台/操作系统绑定,如Form(UI卡片信息)、AppItem(App描述信息)、PixelMap(缩略图格式)等,该类数据可以实现系统/平台内的跨应用、跨设备流转,如图3所示。 +**系统相关数据类型(System Defined Type, SDT):** 与具体的平台/操作系统绑定,如Form(UI卡片信息)、AppItem(App描述信息)、PixelMap(缩略图格式)等,该类数据可以实现系统/平台内的跨应用流转,如图3所示。 **图3** UDMF SDT数据类型示意图 ![UDMF_SDT](figures/udmf_type_SDT.png) -**应用自定义数据类型(App Defined Type, ADT):** 单个应用自定义的数据,该类数据可以实现应用内的跨平台与跨设备流转,如图4所示为例,应用可自定义MyFile类型文件格式在应用生态内部使用。 +**应用自定义数据类型(App Defined Type, ADT):** 单个应用自定义的数据,该类数据可以实现应用内的跨平台流转,如图4所示为例,应用可自定义MyFile类型文件格式在应用生态内部使用。 **图4** UDMF ADT数据类型示意图 @@ -41,54 +41,55 @@ UDMF提供的标准化数据类型主要包括以下几类: UDMF提供了统一数据对象UnifiedData,用于封装一组数据记录UnifiedRecord。数据记录UnifiedRecord则是对UDMF支持的数据内容的抽象定义,例如一条文本记录、一条图片记录等。 数据记录中的数据内容类型对应为各数据类型UnifiedDataType。 + 以下是常见的UDMF的接口说明,更多接口和具体说明,请见[ @ohos.data.UDMF(统一数据管理框架)](../reference/apis/js-apis-data-udmf.md)。 -| 接口名称 | 描述 | -|-------------------|-----------------------------------------------------------------------------------------------| -| getType(): string | 获取当前数据记录对应的具体数据类型。 | -| constructor(record: UnifiedRecord) | 用于创建带有一条数据记录的统一数据对象。 | -| addRecord(record: UnifiedRecord): void | 在当前统一数据对象中添加一条数据记录。 | -| getRecords(): Array\ | 将当前统一数据对象中的所有数据记录取出,通过本接口取出的数据为UnifiedRecord类型,需通过getType获取数据类型后转为子类再使用。 | +| 类名称 | 接口名称 | 描述 | +|---------------|-------------------|-----------------------------------------------------------------------------------------------| +| UnifiedRecord | getType(): string | 获取当前数据记录对应的具体数据类型。 | +| UnifiedData | constructor(record: UnifiedRecord) | 用于创建带有一条数据记录的统一数据对象。 | +| UnifiedData | addRecord(record: UnifiedRecord): void | 在当前统一数据对象中添加一条数据记录。 | +| UnifiedData | getRecords(): Array\ | 将当前统一数据对象中的所有数据记录取出,通过本接口取出的数据为UnifiedRecord类型,需通过getType获取数据类型后转为子类再使用。 | ## 开发步骤 -以一次创建数据(包含图片、纯文本、二进制图片三条数据记录)为例,说明开发步骤。 +以一次创建统一数据对象(包含图片、纯文本两条数据记录)为例,说明开发步骤。 1. 导入`@ohos.data.UDMF`模块。 - ```js + ```ts import UDMF from '@ohos.data.UDMF'; ``` 2. 创建图片数据记录,并初始化得到带有该数据记录的UnifiedData对象。 (1)创建图片数据记录。 - ```js + ```ts let image = new UDMF.Image(); ``` (2)修改对象属性。 - ```js + ```ts // Image对象包含一个属性imageUri image.imageUri = '...'; ``` (3)访问对象属性。 - ```js + ```ts console.info(`imageUri = ${image.imageUri}`); ``` (4)创建一个统一数据对象实例。 - ```js + ```ts let unifiedData = new UDMF.UnifiedData(image); ``` 3. 创建纯文本数据类型记录,将其添加到刚才创建的UnifiedData对象。 - ```js + ```ts let plainText = new UDMF.PlainText(); plainText.textContent = 'this is textContent of plainText'; plainText.abstract = 'abstract of plainText'; @@ -98,21 +99,14 @@ UDMF提供了统一数据对象UnifiedData,用于封装一组数据记录Unifi }; unifiedData.addRecord(plainText); ``` -4. 创建二进制图片数据类型记录,将其添加到UnifiedData对象。 - - ```js - let sdPixelMap = new UDMF.SystemDefinedPixelMap(); - sdPixelMap.rawData = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]); - unifiedData.addRecord(sdPixelMap); - ``` -5. 记录添加完成后,可获取当前UnifiedData对象内的所有数据记录。 +4. 记录添加完成后,可获取当前UnifiedData对象内的所有数据记录。 - ```js + ```ts let records = unifiedData.getRecords(); ``` -6. 遍历每条记录,判断该记录的数据类型,转换为子类对象,得到原数据记录。 +5. 遍历每条记录,判断该记录的数据类型,转换为子类对象,得到原数据记录。 - ```js + ```ts for (let i = 0; i < records.length; i ++) { // 读取该数据记录的类型 let type = records[i].getType(); -- GitLab