You need to sign in or sign up before continuing.
unified-data-channels.md 7.5 KB
Newer Older
D
dboy190 已提交
1
# 通过标准化数据通路实现数据共享
D
dboy190 已提交
2 3 4 5


## 场景介绍

D
dboy190 已提交
6 7
在多对多跨应用数据共享的场景下,需要提供一条数据通路能接入多个不同应用的数据并共享给其他应用进行读取,同时对通道中数据的访问权限和生命周期
进行统一的管理。
D
dboy190 已提交
8

D
dboy190 已提交
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
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。
D
dboy190 已提交
37 38 39

## 接口说明

D
dboy190 已提交
40 41
以下是UDMF标准化数据通路的相关接口,均为异步接口。异步接口均有callback和Promise两种返回形式,下表均以callback形式为例,
更多接口及使用方式请见[统一数据管理框架](../reference/apis/js-apis-data-udmf.md)
D
dboy190 已提交
42

D
dboy190 已提交
43 44 45 46 47 48
| 接口名称                                                                                   | 描述                                          | 
|----------------------------------------------------------------------------------------|---------------------------------------------|
| insertData(options: Options, data: UnifiedData, callback: AsyncCallback<string>): void | 将数据写入UDMF的公共存储中,并生成数据的唯一标识符,使用callback异步回调。 | 
| updateData(options: Options, data: UnifiedData, callback: AsyncCallback<void>): void   | 更新已写入UDMF的公共存储的数据,使用callback异步回调。           | 
| queryData(options: Options, callback: AsyncCallback<Array<UnifiedData>>): void         | 查询UDMF公共存储的数据,使用callback异步回调。               | 
| deleteData(options: Options, callback: AsyncCallback<Array<UnifiedData>>): void        | 删除UDMF公共存储的数据,返回删除的数据集,使用callback异步回调。 |
D
dboy190 已提交
49 50 51 52


## 开发步骤

D
dboy190 已提交
53 54 55 56
以一次多对多数据共享的过程为例说明开发步骤,数据提供方可以通过UMDF提供的接口将数据写入公共存储通道,并对其进行更新和删除操作。数据访问方可以通过UDMF提供的查询接口获取数据
提供方共享的数据。示例代码均采用Callback形式,Promise形式请见[ @ohos.data.UDMF(统一数据管理框架)](../reference/apis/js-apis-data-udmf.md)

### 数据提供方
D
dboy190 已提交
57

D
dboy190 已提交
58
1. 导入`@ohos.data.UDMF`模块。
D
dboy190 已提交
59

D
dboy190 已提交
60
   ```ts
D
dboy190 已提交
61 62
   import UDMF from '@ohos.data.UDMF';
   ```
D
dboy190 已提交
63
2. 创建一个统一数据对象并插入到UDMF的公共存储中。
D
dboy190 已提交
64

D
dboy190 已提交
65
   ```ts
D
dboy190 已提交
66 67 68 69 70
   let plainText = new UDMF.PlainText();
   plainText.textContent = 'hello world!';
   let unifiedData = new UDMF.UnifiedData(plainText);
   
   let options = {
D
dboy190 已提交
71
       intention: UDMF.Intention.DATA_HUB
D
dboy190 已提交
72 73 74 75 76 77 78 79 80 81 82 83
   }
   try {
       UDMF.insertData(options, unifiedData, (err, data) => {
           if (err === undefined) {
               console.info(`Succeeded in inserting data. key = ${data}`);
           } else {
               console.error(`Failed to insert data. code is ${err.code},message is ${err.message} `);
           }
       });
   } catch(e) {
       console.error(`Insert data throws an exception. code is ${e.code},message is ${e.message} `);
   }
D
dboy190 已提交
84
   ```
D
dboy190 已提交
85
3. 更新上一步骤插入的统一数据对象。
D
dboy190 已提交
86

D
dboy190 已提交
87
   ```ts
D
dboy190 已提交
88
   let plainText = new UDMF.PlainText();
D
dboy190 已提交
89 90 91 92
   plainText.textContent = 'hello world!';
   let unifiedData = new UDMF.UnifiedData(plainText);
   
   let options = {
D
dboy190 已提交
93
       key: 'udmf://DataHub/com.ohos.test/0123456789'
D
dboy190 已提交
94
   };
D
dboy190 已提交
95 96 97 98 99 100 101 102 103 104 105 106
   
   try {
       UDMF.updateData(options, unifiedData, (err) => {
           if (err === undefined) {
               console.info('Succeeded in updating data.');
           } else {
               console.error('Failed to update data. code is ${err.code},message is ${err.message} `);
           }
       });
   } catch(e) {
       console.error(`Update data throws an exception. code is ${e.code},message is ${e.message} `);
   }
D
dboy190 已提交
107
   ```
D
dboy190 已提交
108
4. 删除存储在UDMF公共存储中的统一数据对象。
D
dboy190 已提交
109

D
dboy190 已提交
110
   ```ts
D
dboy190 已提交
111
   let options = {
D
dboy190 已提交
112
    intention: UDMF.Intention.DATA_HUB
D
dboy190 已提交
113 114 115
   };
   
   try {
D
dboy190 已提交
116
       UDMF.deleteData(options, (err, data) => {
D
dboy190 已提交
117
           if (err === undefined) {
D
dboy190 已提交
118
               console.info(`Succeeded in deleting data. size = ${data.length}`);
D
dboy190 已提交
119 120 121 122 123 124 125 126 127 128
               for (let i = 0; i < data.length; i++) {
                   let records = data[i].getRecords();
                   for (let j = 0; j < records.length; j++) {
                       if (records[j].getType() === UDMF.UnifiedDataType.PLAIN_TEXT) {
                           let text = <UDMF.PlainText>(records[j]);
                           console.info(`${i + 1}.${text.textContent}`);
                       }
                   }
               }
           } else {
D
dboy190 已提交
129
               console.error(`Failed to delete data. code is ${err.code},message is ${err.message} `);
D
dboy190 已提交
130 131 132
           }
       });
   } catch(e) {
D
dboy190 已提交
133
       console.error(`Delete data throws an exception. code is ${e.code},message is ${e.message} `);
D
dboy190 已提交
134
   }
D
dboy190 已提交
135
   ```
D
dboy190 已提交
136 137 138 139 140 141 142 143 144
   
### 数据访问方

1. 导入`@ohos.data.UDMF`模块。

   ```ts
   import UDMF from '@ohos.data.UDMF';
   ```
2. 查询存储在UDMF公共存储中的统一数据对象。
D
dboy190 已提交
145

D
dboy190 已提交
146
   ```ts
D
dboy190 已提交
147
   let options = {
D
dboy190 已提交
148
    intention: UDMF.Intention.DATA_HUB
D
dboy190 已提交
149 150 151
   };
   
   try {
D
dboy190 已提交
152
       UDMF.queryData(options, (err, data) => {
D
dboy190 已提交
153
           if (err === undefined) {
D
dboy190 已提交
154
               console.info(`Succeeded in querying data. size = ${data.length}`);
D
dboy190 已提交
155 156 157 158 159 160 161 162 163 164
               for (let i = 0; i < data.length; i++) {
                   let records = data[i].getRecords();
                   for (let j = 0; j < records.length; j++) {
                       if (records[j].getType() === UDMF.UnifiedDataType.PLAIN_TEXT) {
                           let text = <UDMF.PlainText>(records[j]);
                           console.info(`${i + 1}.${text.textContent}`);
                       }
                   }
               }
           } else {
D
dboy190 已提交
165
               console.error(`Failed to query data. code is ${err.code},message is ${err.message} `);
D
dboy190 已提交
166 167 168
           }
       });
   } catch(e) {
D
dboy190 已提交
169
       console.error(`Query data throws an exception. code is ${e.code},message is ${e.message} `);
D
dboy190 已提交
170 171
   }
   ```