1# 数据共享开发指导 2DataShare即数据共享模块,提供了向其他应用共享以及管理其数据的方法。目前仅支持同个设备上应用之间的数据共享。 3 4## 接口说明 5 6**表1** 数据提供方API说明 7 8|接口名|描述| 9|:------|:------| 10|onCreate?(want: Want, callback: AsyncCallback<void>): void|DataShareExtensionAbility生命周期回调,在数据提供方应用创建时回调,执行初始化业务逻辑操作,如创建数据库。| 11|insert?(uri: string, valueBucket: ValuesBucket, callback: AsyncCallback<number>): void|业务函数,在访问方向数据库中插入数据时回调。| 12|update?(uri: string, predicates: DataSharePredicates, valueBucket: ValuesBucket, callback: AsyncCallback<number>): void|业务函数,在访问方更新数据时回调。| 13|query?(uri: string, predicates: DataSharePredicates, columns: Array<string>, callback: AsyncCallback<Object>): void|业务函数,在访问方查询数据时回调。| 14|delete?(uri: string, predicates: DataSharePredicates, callback: AsyncCallback<number>): void|业务函数,在访问方删除数据时回调。| 15 16完整的数据提供方接口请见[DataShareExtensionAbility](../reference/apis/js-apis-application-dataShareExtensionAbility.md)。 17 18**表2** 数据访问方API说明 19 20| 接口名 | 描述 | 21| :----------------------------------------------------------- | :--------------------------------- | 22| createDataShareHelper(context: Context, uri: string, callback: AsyncCallback<DataShareHelper>): void | 创建DataShare工具类。 | 23| insert(uri: string, value: ValuesBucket, callback: AsyncCallback<number>): void | 将单条数据记录插入数据库。 | 24| update(uri: string, predicates: DataSharePredicates, value: ValuesBucket, callback: AsyncCallback<number>): void | 更新数据库中的数据记录。 | 25| query(uri: string, predicates: DataSharePredicates, columns: Array<string>, callback: AsyncCallback<DataShareResultSet>): void | 查询数据库中的数据。 | 26| delete(uri: string, predicates: DataSharePredicates, callback: AsyncCallback<number>): void | 从数据库中删除一条或多条数据记录。 | 27 28完整的数据访问方接口请见[DataShareHelper](../reference/apis/js-apis-data-dataShare.md)。 29 30## 开发场景 31 32数据共享可分为数据的提供方和访问方两部分。 33 34- 提供方可以选择性实现数据的增、删、改、查,以及文件打开等功能,并对外共享这些数据。 35- 访问方利用工具类,便可以访问提供方提供的这些数据。 36 37以下是数据提供方和数据访问方应用的各自开发示例。 38 39### 数据提供方应用的开发(仅限系统应用) 40 41[DataShareExtensionAbility](../reference/apis/js-apis-application-dataShareExtensionAbility.md)提供以下API,根据需要重写对应回调方法。 42 43- **onCreate** 44 45 DataShare客户端连接DataShareExtensionAbility服务端时,服务端回调此接口,执行初始化业务逻辑操作。该方法可以选择性重写。 46 47- **insert** 48 49 业务函数,客户端请求插入数据时回调此接口,服务端需要在此回调中实现插入数据功能,该方法可以选择性重写。 50 51- **update** 52 53 业务函数,客户端请求更新数据时回调此接口,服务端需要在此回调中实现更新数据功能,该方法可以选择性重写。 54 55- **delete** 56 57 业务函数,客户端请求删除数据时回调此接口,服务端需要在此回调中实现删除数据功能,该方法可以选择性重写。 58 59- **query** 60 61 业务函数,客户端请求查询数据时回调此接口,服务端需要在此回调中实现查询数据功能,该方法可以选择性重写。 62 63- **batchInsert** 64 65 业务函数,客户端请求批量插入数据时回调此接口,服务端需要在此回调中实现批量插入数据数据功能,该方法可以选择性重写。 66 67- **normalizeUri** 68 69 业务函数,客户端给定的URI转换为服务端使用的URI时回调此接口,该方法可以选择性重写。 70 71- **denormalizeUri** 72 73 业务函数,服务端使用的URI转换为客户端传入的初始URI时服务端回调此接口,该方法可以选择性重写。 74 75开发者在实现一个数据共享服务时,需要在DevEco Studio工程中手动新建一个DataShareExtensionAbility,具体步骤如下。 76 771. 在工程Module对应的ets目录下,右键选择“New > Directory”,新建一个目录并命名为DataShareAbility。 78 792. 在DataShareAbility目录,右键选择“New > TypeScript File”,新建一个TypeScript文件并命名为DataShareAbility.ts。 80 813. 在DataShareAbility.ts文件中,增加导入DataShareExtensionAbility的依赖包,开发者可根据应用需求选择性重写其业务实现。例如数据提供方只提供插入、删除和查询服务,则可只重写这些接口。 82 83 844. 导入基础依赖包。 85 86 ```ts 87 import Extension from '@ohos.application.DataShareExtensionAbility'; 88 import rdb from '@ohos.data.relationalStore'; 89 import fileIo from '@ohos.fileio'; 90 import dataSharePredicates from '@ohos.data.dataSharePredicates'; 91 ``` 92 935. 数据提供方(也称服务端)继承于DataShareExtensionAbility,开发者可根据应用需求选择性重写其业务实现。例如数据提供方只提供查询服务,则可只重写查询接口。 94 956. 数据提供方的业务实现由开发者自定义。例如可以通过数据库、读写文件或访问网络等各方式实现数据提供方的数据存储。 96 97 ```ts 98 const DB_NAME = "DB00.db"; 99 const TBL_NAME = "TBL00"; 100 const DDL_TBL_CREATE = "CREATE TABLE IF NOT EXISTS " 101 + TBL_NAME 102 + " (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER, isStudent BOOLEAN, Binary BINARY)"; 103 104 let rdbStore; 105 let result; 106 107 export default class DataShareExtAbility extends Extension { 108 private rdbStore_; 109 110 // 重写onCreate接口 111 onCreate(want, callback) { 112 result = this.context.cacheDir + '/datashare.txt'; 113 // 业务实现使用RDB 114 rdb.getRdbStore(this.context, { 115 name: DB_NAME, 116 securityLevel: rdb.SecurityLevel.S1 117 }, function (err, data) { 118 rdbStore = data; 119 rdbStore.executeSql(DDL_TBL_CREATE, [], function (err) { 120 console.log('DataShareExtAbility onCreate, executeSql done err:' + JSON.stringify(err)); 121 }); 122 if (callback) { 123 callback(); 124 } 125 }); 126 } 127 128 // 重写query接口 129 query(uri, predicates, columns, callback) { 130 if (predicates == null || predicates == undefined) { 131 console.info('invalid predicates'); 132 } 133 try { 134 rdbStore.query(TBL_NAME, predicates, columns, function (err, resultSet) { 135 if (resultSet != undefined) { 136 console.info('resultSet.rowCount: ' + resultSet.rowCount); 137 } 138 if (callback != undefined) { 139 callback(err, resultSet); 140 } 141 }); 142 } catch (err) { 143 console.error('error' + err); 144 } 145 } 146 // 可根据应用需求,选择性重写各个接口 147 // ... 148 }; 149 ``` 150 1517. 在module.json5中定义DataShareExtensionAbility。 152 153 | Json重要字段 | 备注说明 | 154 | ------------ | ------------------------------------------------------------ | 155 | "name" | Ability名称,对应Ability派生的ExtensionAbility类名。 | 156 | "type" | Ability类型,DataShare对应的Ability类型为”dataShare“,表示基于datashare模板开发的。 | 157 | "uri" | 通信使用的URI,是客户端链接服务端的唯一标识。 | 158 | "visible" | 对其他应用是否可见,设置为true时,才能与其他应用进行通信传输数据。 | 159 160 **module.json5配置样例** 161 162 ```json 163 "extensionAbilities": [ 164 { 165 "srcEntrance": "./ets/DataShareExtAbility/DataShareExtAbility.ts", 166 "name": "DataShareExtAbility", 167 "icon": "$media:icon", 168 "description": "$string:description_datashareextability", 169 "type": "dataShare", 170 "uri": "datashare://com.samples.datasharetest.DataShare", 171 "visible": true 172 } 173 ] 174 ``` 175 176### 数据访问方应用的开发 177 1781. 导入基础依赖包。 179 180 ```ts 181 import UIAbility from '@ohos.app.ability.UIAbility'; 182 import dataShare from '@ohos.data.dataShare'; 183 import dataSharePredicates from '@ohos.data.dataSharePredicates'; 184 ``` 185 1862. 定义与数据提供方通信的URI字符串。 187 188 ```ts 189 // 作为参数传递的URI,与module.json5中定义的URI的区别是多了一个"/",是因为作为参数传递的URI中,在第二个与第三个"/"中间,存在一个DeviceID的参数 190 let dseUri = ("datashare:///com.samples.datasharetest.DataShare"); 191 ``` 192 1933. 创建工具接口类对象。 194 195 ```ts 196 let dsHelper; 197 let abilityContext; 198 199 export default class EntryAbility extends UIAbility { 200 onWindowStageCreate(windowStage) { 201 abilityContext = this.context; 202 dataShare.createDataShareHelper(abilityContext, dseUri, (err, data)=>{ 203 dsHelper = data; 204 }); 205 } 206 } 207 ``` 208 2094. 获取到接口类对象后,便可利用其提供的接口访问提供方提供的服务,如进行数据的增删改查等。 210 211 ```ts 212 // 构建一条数据 213 let valuesBucket = { "name": "ZhangSan", "age": 21, "isStudent": false, "Binary": new Uint8Array([1, 2, 3]) }; 214 let updateBucket = { "name": "LiSi", "age": 18, "isStudent": true, "Binary": new Uint8Array([1, 2, 3]) }; 215 let predicates = new dataSharePredicates.DataSharePredicates(); 216 let valArray = ['*']; 217 // 插入一条数据 218 dsHelper.insert(dseUri, valuesBucket, (err, data) => { 219 console.log("dsHelper insert result: " + data); 220 }); 221 // 更新数据 222 dsHelper.update(dseUri, predicates, updateBucket, (err, data) => { 223 console.log("dsHelper update result: " + data); 224 }); 225 // 查询数据 226 dsHelper.query(dseUri, predicates, valArray, (err, data) => { 227 console.log("dsHelper query result: " + data); 228 }); 229 // 删除指定的数据 230 dsHelper.delete(dseUri, predicates, (err, data) => { 231 console.log("dsHelper delete result: " + data); 232 }); 233 ``` 234 235