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