1# 通过标准化数据通路实现数据共享 2 3 4## 场景介绍 5 6在多对多跨应用数据共享的场景下,需要提供一条数据通路能够接入多个不同应用的数据并共享给其他应用进行读取。 7 8UDMF针对多对多跨应用数据共享的不同业务场景提供了标准化的数据通路,提供了标准化的数据接入与读取接口。 9 10## 标准化数据通路的定义和实现 11 12标准化数据通路是为各种业务场景提供的跨应用的数据接入与读取通路,它可以暂存应用需要共享的符合标准化数据定义的统一数据对象,并提供给其他应用进行访问,同时按照一定的策略对暂存数据的访问权限和生命周期进行管理。 13 14标准化数据通路通过UDMF提供的系统服务实现,应用(数据提供方)需要共享公共数据时可以通过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提供的接口将数据写入公共数据通路,并对其进行更新和删除操作。数据访问方可以通过UDMF提供的查询接口获取数据提供方共享的数据。 45 46### 数据提供方 47 481. 导入`@ohos.data.unifiedDataChannel`和`@ohos.data.uniformTypeDescriptor`模块。 49 50 ```ts 51 import unifiedDataChannel from '@ohos.data.unifiedDataChannel'; 52 import uniformTypeDescriptor from '@ohos.data.uniformTypeDescriptor'; 53 ``` 542. 创建一个统一数据对象并插入到UDMF的公共数据通路中。 55 56 ```ts 57 import { BusinessError } from '@ohos.base'; 58 let plainText = new unifiedDataChannel.PlainText(); 59 plainText.textContent = 'hello world!'; 60 let unifiedData = new unifiedDataChannel.UnifiedData(plainText); 61 62 // 指定要插入数据的数据通路枚举类型 63 let options: unifiedDataChannel.Options = { 64 intention: unifiedDataChannel.Intention.DATA_HUB 65 } 66 try { 67 unifiedDataChannel.insertData(options, unifiedData, (err, data) => { 68 if (err === undefined) { 69 console.info(`Succeeded in inserting data. key = ${data}`); 70 } else { 71 console.error(`Failed to insert data. code is ${err.code},message is ${err.message} `); 72 } 73 }); 74 } catch (e) { 75 let error: BusinessError = e as BusinessError; 76 console.error(`Insert data throws an exception. code is ${error.code},message is ${error.message} `); 77 } 78 ``` 793. 更新上一步骤插入的统一数据对象。 80 81 ```ts 82 import { BusinessError } from '@ohos.base'; 83 let plainText = new unifiedDataChannel.PlainText(); 84 plainText.textContent = 'How are you!'; 85 let unifiedData = new unifiedDataChannel.UnifiedData(plainText); 86 87 // 指定要更新的统一数据对象的URI 88 let options: unifiedDataChannel.Options = { 89 key: 'udmf://DataHub/com.ohos.test/0123456789' 90 }; 91 92 try { 93 unifiedDataChannel.updateData(options, unifiedData, (err) => { 94 if (err === undefined) { 95 console.info('Succeeded in updating data.'); 96 } else { 97 console.error(`Failed to update data. code is ${err.code},message is ${err.message} `); 98 } 99 }); 100 } catch (e) { 101 let error: BusinessError = e as BusinessError; 102 console.error(`Update data throws an exception. code is ${error.code},message is ${error.message} `); 103 } 104 ``` 1054. 删除存储在UDMF公共数据通路中的统一数据对象。 106 107 ```ts 108 import { BusinessError } from '@ohos.base'; 109 // 指定要删除数据的数据通路枚举类型 110 let options: unifiedDataChannel.Options = { 111 intention: unifiedDataChannel.Intention.DATA_HUB 112 }; 113 114 try { 115 unifiedDataChannel.deleteData(options, (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. 导入`@ohos.data.unifiedDataChannel`和`@ohos.data.uniformTypeDescriptor`模块。 140 141 ```ts 142 import unifiedDataChannel from '@ohos.data.unifiedDataChannel'; 143 import uniformTypeDescriptor from '@ohos.data.uniformTypeDescriptor'; 144 ``` 1452. 查询存储在UDMF公共数据通路中的统一数据对象。 146 147 ```ts 148 import { BusinessError } from '@ohos.base'; 149 // 指定要查询数据的数据通路枚举类型 150 let options: unifiedDataChannel.Options = { 151 intention: unifiedDataChannel.Intention.DATA_HUB 152 }; 153 154 try { 155 unifiedDataChannel.queryData(options, (err, data) => { 156 if (err === undefined) { 157 console.info(`Succeeded in querying data. size = ${data.length}`); 158 for (let i = 0; i < data.length; i++) { 159 let records = data[i].getRecords(); 160 for (let j = 0; j < records.length; j++) { 161 if (records[j].getType() === uniformTypeDescriptor.UniformDataType.PLAIN_TEXT) { 162 let text = records[j] as unifiedDataChannel.PlainText; 163 console.info(`${i + 1}.${text.textContent}`); 164 } 165 } 166 } 167 } else { 168 console.error(`Failed to query data. code is ${err.code},message is ${err.message} `); 169 } 170 }); 171 } catch(e) { 172 let error: BusinessError = e as BusinessError; 173 console.error(`Query data throws an exception. code is ${error.code},message is ${error.message} `); 174 } 175 ``` 176