提交 b261a291 编写于 作者: D dboy190

fix review problem 1

Signed-off-by: Ndboy190 <dulei1@huawei.com>
上级 33cfe63d
......@@ -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的不同通道中形成聚合效应,提升开发者跨应用数据协同的效率,同时提升用户的数据体验。
......@@ -3,12 +3,42 @@
## 场景介绍
UDMF定义了安全、标准化的数据接入与读取通路,为各种业务场景(如跨应用跨设备数据拖拽)提供了跨应用、跨设备的数据接入与读取通路,降低业务跨应用、跨设备数据交互的成本。
在多对多跨应用数据共享的场景下,需要提供一条数据通路能接入多个不同应用的数据并共享给其他应用进行读取,同时对通道中数据的访问权限和生命周期
进行统一的管理。
UDMF针对多对多跨应用数据共享的不同业务场景提供了标准化的数据通路,提供了标准化的数据接入与读取接口,并按照一定策略管理通道中数据的访问权限和生命周期。
## 标准化数据通路的定义和实现
标准化数据通路是为各种业务场景提供的跨应用的数据接入与读取通路,它可以暂存应用需要共享的符合标准化数据定义的统一数据对象,并提供给其他应用进行访问,
同时按照一定的策略对暂存数据的访问权限和生命周期进行管理。
标准化数据通路通过UDMF提供的系统服务实现,应用(数据提供方)需要共享公共数据时可以通过UDMF提供的插入接口将数据写入到UDMF的数据通路中,
并且可以通过UDMF提供的更新和删除接口对已经存入UDMF数据通路的数据进行更新和删除操作。在完成必要的权限校验后,
目标应用(数据访问方)可以通过UDMF提供的读取接口进行数据的访问,数据被读取后,UDMF会统一对数据的生命周期进行管理。
统一数据对象UnifiedData在UDMF数据通路中具有全局唯一URI标识,其定义为udmf://intension/bundleName/groupName/guid,其中各组成部分的含义分别为:
**udmf:** 协议名,表示使用UDMF提供的数据通路。
**intension:** 通道分类,对应不同的业务场景。
**bundleName:** 数据来源应用的包名称。
**groupName:** 分组名称,支持批量数据分组管理。
**guid:** 系统生成的数据id,全局唯一。
当前UDMF中的跨应用数据共享通路有:
- **公共数据通路**
应用共享的公用数据共享通路,应用均可写入和读取数据,对应的Intention枚举类型为DATA_HUB。
## 接口说明
以下是UDMF标准化数据通路的相关接口,均为异步接口。异步接口均有callback和Promise两种返回形式,下表均以callback形式为例,更多接口及使用方式请见[统一数据管理框架](../reference/apis/js-apis-data-udmf.md)
以下是UDMF标准化数据通路的相关接口,均为异步接口。异步接口均有callback和Promise两种返回形式,下表均以callback形式为例,
更多接口及使用方式请见[统一数据管理框架](../reference/apis/js-apis-data-udmf.md)
| 接口名称 | 描述 |
|----------------------------------------------------------------------------------------|---------------------------------------------|
......@@ -20,22 +50,25 @@ UDMF定义了安全、标准化的数据接入与读取通路,为各种业务
## 开发步骤
以一次统一数据对象的插入、更新、查询和删除为例,说明开发步骤,示例代码均采用Callback形式,Promise形式请见。
以一次多对多数据共享的过程为例说明开发步骤,数据提供方可以通过UMDF提供的接口将数据写入公共存储通道,并对其进行更新和删除操作。数据访问方可以通过UDMF提供的查询接口获取数据
提供方共享的数据。示例代码均采用Callback形式,Promise形式请见[ @ohos.data.UDMF(统一数据管理框架)](../reference/apis/js-apis-data-udmf.md)
### 数据提供方
1. 导入`@ohos.data.UDMF`模块。
```js
```ts
import UDMF from '@ohos.data.UDMF';
```
2. 创建一个统一数据对象并插入到UDMF的公共存储中。
```js
```ts
let plainText = new UDMF.PlainText();
plainText.textContent = 'hello world!';
let unifiedData = new UDMF.UnifiedData(plainText);
let options = {
intention: UDMF.Intention.SUPER_HUB
intention: UDMF.Intention.DATA_HUB
}
try {
UDMF.insertData(options, unifiedData, (err, data) => {
......@@ -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} `);
}
```
......@@ -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> | 将当前统一数据对象中的所有数据记录取出,通过本接口取出的数据为UnifiedRecord类型,需通过getType获取数据类型后转为子类再使用。 |
| 类名称 | 接口名称 | 描述 |
|---------------|-------------------|-----------------------------------------------------------------------------------------------|
| UnifiedRecord | getType(): string | 获取当前数据记录对应的具体数据类型。 |
| UnifiedData | constructor(record: UnifiedRecord) | 用于创建带有一条数据记录的统一数据对象。 |
| UnifiedData | addRecord(record: UnifiedRecord): void | 在当前统一数据对象中添加一条数据记录。 |
| UnifiedData | getRecords(): Array\<UnifiedRecord> | 将当前统一数据对象中的所有数据记录取出,通过本接口取出的数据为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();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册