1# 通过标准化数据通路实现数据共享
2
3
4## 场景介绍
5
6在多对多跨应用数据共享的场景下,需要提供一条数据通路能够接入多个不同应用的数据并共享给其他应用进行读取。
7
8UDMF针对多对多跨应用数据共享的不同业务场景提供了标准化的数据通路,提供了标准化的数据接入与读取接口。
9
10## 标准化数据通路的定义和实现
11
12标准化数据通路是为各种业务场景提供的跨应用的数据接入与读取通路,它可以暂存应用需要共享的符合标准化数据定义的统一数据对象,并提供给其他应用进行访问,同时按照一定的策略对暂存数据的修改、删除权限和生命周期进行管理。
13
14标准化数据通路通过UDMF提供的系统服务实现,应用(数据提供方)需要共享公共数据时可以通过UDMF提供的插入接口将数据写入到UDMF的数据通路中,并且可以通过UDMF提供的更新和删除接口对本应用已经存入数据进行更新和删除操作。目标应用(数据访问方)可以通过UDMF提供的读取接口进行数据的访问。UDMF会统一对数据的生命周期进行管理,每小时定期清理存入时长超过一小时的数据。
15
16统一数据对象UnifiedData在UDMF数据通路中具有全局唯一URI标识,其定义为udmf://intention/bundleName/groupId,其中各组成部分的含义分别为:
17
18+ **udmf:** 协议名,表示使用UDMF提供的数据通路。
19
20+ **intention:** UDMF已经支持的数据通路类型枚举值,对应不同的业务场景。
21
22+ **bundleName:** 数据来源应用的包名称。
23
24+ **groupId:** 分组名称,支持批量数据分组管理。
25
26当前UDMF中的跨应用数据共享通路有:**公共数据通路**
27
28**公共数据通路**:应用共享的公用数据共享通路,所有应用均可向通路中写入数据,写入方可以根据写入数据时生成的数据唯一标识符进行数据的更新、删除、指定数据标识符进行查询、全量查询,而数据读取方只能读取当前数据通路中的全量数据,通路对应的Intention枚举类型为DATA_HUB。
29
30## 接口说明
31
32以下是UDMF标准化数据通路的相关接口,均为异步接口。异步接口均有callback和Promise两种返回形式,下表均以callback形式为例,更多接口及使用方式请见[标准化数据通路](../reference/apis-arkdata/js-apis-data-unifiedDataChannel.md)和[标准化数据定义与描述](../reference/apis-arkdata/js-apis-data-uniformTypeDescriptor.md)。
33
34| 接口名称                                                                                    | 描述                                          |
35|-----------------------------------------------------------------------------------------|---------------------------------------------|
36| insertData(options: Options, data: UnifiedData, callback: AsyncCallback\<string>): void | 将数据写入UDMF的公共数据通路中,并生成数据的唯一标识符,使用callback异步回调。 |
37| updateData(options: Options, data: UnifiedData, callback: AsyncCallback\<void>): void   | 更新已写入UDMF的公共数据通路的数据,使用callback异步回调。           |
38| queryData(options: Options, callback: AsyncCallback\<Array\<UnifiedData>>): void        | 查询UDMF公共数据通路的数据,使用callback异步回调。               |
39| deleteData(options: Options, callback: AsyncCallback\<Array\<UnifiedData>>): void       | 删除UDMF公共数据通路的数据,返回删除的数据集,使用callback异步回调。 |
40
41
42## 开发步骤
43
44以一次多对多数据共享的过程为例说明开发步骤,数据提供方可以通过UMDF提供的insertData接口将数据写入公共数据通路,获取到的返回值(生成的数据的唯一标识符),可用于对其插入的数据进行更新和删除操作。数据访问方则可以通过UDMF提供的查询接口获取当前公共数据通路的全量数据。
45
46### 数据提供方
47
481. 导入unifiedDataChannel和uniformTypeDescriptor模块。
49
50   ```ts
51   import { unifiedDataChannel, uniformTypeDescriptor } from '@kit.ArkData';
52   ```
532. 创建一个统一数据对象并插入到UDMF的公共数据通路中。
54
55   ```ts
56   import { BusinessError } from '@kit.BasicServicesKit';
57   let plainText = new unifiedDataChannel.PlainText();
58   plainText.textContent = 'hello world!';
59   let unifiedData = new unifiedDataChannel.UnifiedData(plainText);
60
61   // 指定要插入数据的数据通路枚举类型
62   let options: unifiedDataChannel.Options = {
63     intention: unifiedDataChannel.Intention.DATA_HUB
64   }
65   try {
66     unifiedDataChannel.insertData(options, unifiedData, (err, key) => {
67       if (err === undefined) {
68         console.info(`Succeeded in inserting data. key = ${key}`);
69       } else {
70         console.error(`Failed to insert data. code is ${err.code},message is ${err.message} `);
71       }
72     });
73   } catch (e) {
74     let error: BusinessError = e as BusinessError;
75     console.error(`Insert data throws an exception. code is ${error.code},message is ${error.message} `);
76   }
77   ```
783. 更新上一步骤插入的统一数据对象。
79
80   ```ts
81   let plainTextUpdate = new unifiedDataChannel.PlainText();
82   plainTextUpdate.textContent = 'How are you!';
83   let unifiedDataUpdate = new unifiedDataChannel.UnifiedData(plainTextUpdate);
84
85   // 指定要更新的统一数据对象的URI
86   let optionsUpdate: unifiedDataChannel.Options = {
87     // 此处的key值仅为示例,不可直接使用,其值与insertData接口回调函数中key保持一致
88     key: 'udmf://DataHub/com.ohos.test/0123456789'
89   };
90
91   try {
92     unifiedDataChannel.updateData(optionsUpdate, unifiedDataUpdate, (err) => {
93       if (err === undefined) {
94         console.info('Succeeded in updating data.');
95       } else {
96         console.error(`Failed to update data. code is ${err.code},message is ${err.message} `);
97       }
98     });
99   } catch (e) {
100     let error: BusinessError = e as BusinessError;
101     console.error(`Update data throws an exception. code is ${error.code},message is ${error.message} `);
102   }
103   ```
1044. 删除存储在UDMF公共数据通路中的统一数据对象。
105
106   ```ts
107   // 指定要删除数据的数据通路枚举类型
108   let optionsDelete: unifiedDataChannel.Options = {
109     intention: unifiedDataChannel.Intention.DATA_HUB
110   };
111
112   try {
113     unifiedDataChannel.deleteData(optionsDelete, (err, data) => {
114       if (err === undefined) {
115         console.info(`Succeeded in deleting data. size = ${data.length}`);
116         for (let i = 0; i < data.length; i++) {
117           let records = data[i].getRecords();
118           for (let j = 0; j < records.length; j++) {
119             if (records[j].getType() === uniformTypeDescriptor.UniformDataType.PLAIN_TEXT) {
120               let text = records[j] as unifiedDataChannel.PlainText;
121               console.info(`${i + 1}.${text.textContent}`);
122             }
123           }
124         }
125       } else {
126         console.error(`Failed to delete data. code is ${err.code},message is ${err.message} `);
127       }
128     });
129   } catch (e) {
130     let error: BusinessError = e as BusinessError;
131     console.error(`Delete data throws an exception. code is ${error.code},message is ${error.message} `);
132   }
133   ```
134
135### 数据访问方
136
1371. 导入unifiedDataChannel和uniformTypeDescriptor模块。
138
139   ```ts
140   import { unifiedDataChannel, uniformTypeDescriptor } from '@kit.ArkData';
141   ```
1422. 查询存储在UDMF公共数据通路中的全量统一数据对象。
143
144   ```ts
145   import { BusinessError } from '@kit.BasicServicesKit';
146   // 指定要查询数据的数据通路枚举类型
147   let options: unifiedDataChannel.Options = {
148     intention: unifiedDataChannel.Intention.DATA_HUB
149   };
150
151   try {
152     unifiedDataChannel.queryData(options, (err, data) => {
153       if (err === undefined) {
154         console.info(`Succeeded in querying data. size = ${data.length}`);
155         for (let i = 0; i < data.length; i++) {
156           let records = data[i].getRecords();
157           for (let j = 0; j < records.length; j++) {
158             if (records[j].getType() === uniformTypeDescriptor.UniformDataType.PLAIN_TEXT) {
159               let text = records[j] as unifiedDataChannel.PlainText;
160               console.info(`${i + 1}.${text.textContent}`);
161             }
162           }
163         }
164       } else {
165         console.error(`Failed to query data. code is ${err.code},message is ${err.message} `);
166       }
167     });
168   } catch(e) {
169     let error: BusinessError = e as BusinessError;
170     console.error(`Query data throws an exception. code is ${error.code},message is ${error.message} `);
171   }
172   ```
173