1# DataAbility开发指导 2 3## 场景介绍 4 5基于Data模板的Ability(以下简称“Data”),有助于应用管理其自身和其他应用存储数据的访问,并提供与其他应用共享数据的方法。Data既可用于同设备不同应用的数据共享,也支持跨设备不同应用的数据共享。 6 7Data提供方可以自定义数据的增、删、改、查,以及文件打开等功能,并对外提供这些接口。 8 9## URI介绍 10 11Data的提供方和使用方都通过URI(Uniform Resource Identifier)来标识一个具体的数据,例如数据库中的某个表或磁盘上的某个文件。OpenHarmony的URI仍基于URI通用标准,格式如下: 12 13![fa-dataability-uri](figures/fa-dataability-uri.png) 14 15- scheme:协议方案名,固定为“dataability”,代表Data Ability所使用的协议类型。 16- authority:设备ID。如果为跨设备场景,则为目标设备的ID;如果为本地设备场景,则不需要填写。 17- path:资源的路径信息,代表特定资源的位置信息。 18- query:查询参数。 19- fragment:可以用于指示要访问的子资源。 20 21URI示例: 22 23- 跨设备场景:dataability://*device_id*/*com.domainname.dataability.persondata*/*person*/*10* 24- 本地设备:dataability:///*com.domainname.dataability.persondata*/*person*/*10* 25 26> 说明 27> 28> 本地设备的“device_id”字段为空,因此在“dataability:”后面有三个“/”。 29 30## 接口说明 31 32**表1** Data中相关生命周期API功能介绍 33|接口名|描述| 34|:------|:------| 35|onInitialized(info: AbilityInfo): void|在Ability初始化调用,通过此回调方法执行RDB等初始化操作。| 36|update(uri: string, valueBucket: rdb.ValuesBucket, predicates: dataAbility.DataAbilityPredicates, callback: AsyncCallback\<number>): void|更新数据库中的数据。| 37|query(uri: string, columns: Array\<string>, predicates: dataAbility.DataAbilityPredicates, callback: AsyncCallback\<ResultSet>): void|查询数据库中的数据。| 38|delete(uri: string, predicates: dataAbility.DataAbilityPredicates, callback: AsyncCallback\<number>): void|删除一条或多条数据。| 39|normalizeUri(uri: string, callback: AsyncCallback\<string>): void|对URI进行规范化。一个规范化的URI可以支持跨设备使用、持久化、备份和还原等,当上下文改变时仍然可以引用到相同的数据项。| 40|batchInsert(uri: string, valueBuckets: Array\<rdb.ValuesBucket>, callback: AsyncCallback\<number>): void|向数据库中插入多条数据。| 41|denormalizeUri(uri: string, callback: AsyncCallback\<string>): void|将一个由normalizeUri生产的规范化URI转换成非规范化的URI。| 42|insert(uri: string, valueBucket: rdb.ValuesBucket, callback: AsyncCallback\<number>): void|向数据中插入一条数据。| 43|openFile(uri: string, mode: string, callback: AsyncCallback\<number>): void|打开一个文件。| 44|getFileTypes(uri: string, mimeTypeFilter: string, callback: AsyncCallback\<Array\<string>>): void|获取文件的MIME类型。| 45|getType(uri: string, callback: AsyncCallback\<string>): void|获取URI指定数据相匹配的MIME类型。| 46|executeBatch(ops: Array\<DataAbilityOperation>, callback: AsyncCallback\<Array\<DataAbilityResult>>): void|批量操作数据库中的数据。| 47|call(method: string, arg: string, extras: PacMap, callback: AsyncCallback\<PacMap>): void|自定义方法。| 48 49 50## 开发步骤 51### 创建Data 52 531. 实现Data中Insert、Query、Update、Delete接口的业务内容。保证能够满足数据库存储业务的基本需求。BatchInsert与ExecuteBatch接口已经在系统中实现遍历逻辑,依赖Insert、Query、Update、Delete接口逻辑,来实现数据的批量处理。 54 55 创建Data的代码示例如下: 56 57 ```javascript 58 import featureAbility from '@ohos.ability.featureAbility' 59 import dataAbility from '@ohos.data.dataAbility' 60 import dataRdb from '@ohos.data.rdb' 61 62 const TABLE_NAME = 'book' 63 const STORE_CONFIG = { name: 'book.db' } 64 const SQL_CREATE_TABLE = 'CREATE TABLE IF NOT EXISTS book(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, introduction TEXT NOT NULL)' 65 let rdbStore: dataRdb.RdbStore = undefined 66 67 export default { 68 onInitialized(abilityInfo) { 69 console.info('DataAbility onInitialized, abilityInfo:' + abilityInfo.bundleName) 70 let context = featureAbility.getContext() 71 dataRdb.getRdbStore(context, STORE_CONFIG, 1, (err, store) => { 72 console.info('DataAbility getRdbStore callback') 73 store.executeSql(SQL_CREATE_TABLE, []) 74 rdbStore = store 75 }); 76 }, 77 insert(uri, valueBucket, callback) { 78 console.info('DataAbility insert start') 79 rdbStore.insert(TABLE_NAME, valueBucket, callback) 80 }, 81 batchInsert(uri, valueBuckets, callback) { 82 console.info('DataAbility batch insert start') 83 for (let i = 0;i < valueBuckets.length; i++) { 84 console.info('DataAbility batch insert i=' + i) 85 if (i < valueBuckets.length - 1) { 86 rdbStore.insert(TABLE_NAME, valueBuckets[i], (err: any, num: number) => { 87 console.info('DataAbility batch insert ret=' + num) 88 }) 89 } else { 90 rdbStore.insert(TABLE_NAME, valueBuckets[i], callback) 91 } 92 } 93 }, 94 query(uri, columns, predicates, callback) { 95 console.info('DataAbility query start') 96 let rdbPredicates = dataAbility.createRdbPredicates(TABLE_NAME, predicates) 97 rdbStore.query(rdbPredicates, columns, callback) 98 }, 99 update(uri, valueBucket, predicates, callback) { 100 console.info('DataAbilityupdate start') 101 let rdbPredicates = dataAbility.createRdbPredicates(TABLE_NAME, predicates) 102 rdbStore.update(valueBucket, rdbPredicates, callback) 103 }, 104 delete(uri, predicates, callback) { 105 console.info('DataAbilitydelete start') 106 let rdbPredicates = dataAbility.createRdbPredicates(TABLE_NAME, predicates) 107 rdbStore.delete(rdbPredicates, callback) 108 } 109 }; 110 ``` 111 1122. 子模块配置 113 114 | Json重要字段 | 备注说明 | 115 | ------------ | ------------------------------------------------------------ | 116 | "name" | Ability名称,对应Ability派生的Data类名。 | 117 | "type" | Ability类型,Data对应的Ability类型为”data“。 | 118 | "uri" | 通信使用的URI。 | 119 | "exported" | 对其他应用是否可见,设置为true时,Data才能与其他应用进行通信传输数据。 | 120 121 **config.json配置样例** 122 123 ```json 124 "abilities":[{ 125 "srcPath": "DataAbility", 126 "name": ".DataAbility", 127 "icon": "$media:icon", 128 "srcLanguage": "ets", 129 "description": "$string:description_dataability", 130 "type": "data", 131 "exported": true, 132 "uri": "dataability://ohos.samples.etsdataability.DataAbility" 133 }] 134 ``` 135 136### 访问Data 137#### 开发前准备 138 139需导入基础依赖包,以及获取与Data子模块通信的URI字符串。 140 141其中,基础依赖包包括: 142- @ohos.ability.featureAbility 143- @ohos.data.dataAbility 144- @ohos.data.rdb 145 146#### DataAbility接口开发指导 147 148 1491. 创建工具接口类对象。 150 151 工具接口类对象DataAbilityHelper相关接口可参考[DataAbilityHelper模块](../reference/apis/js-apis-inner-ability-dataAbilityHelper.md)。 152 ```js 153 // 作为参数传递的URI,与config中定义的URI的区别是多了一个"/",是因为作为参数传递的URI中,在第二个与第三个"/"中间,存在一个DeviceID的参数 154 import featureAbility from '@ohos.ability.featureAbility' 155 import ohos_data_ability from '@ohos.data.dataAbility' 156 import ohos_data_rdb from '@ohos.data.rdb' 157 158 var urivar = "dataability:///com.ix.DataAbility" 159 var DAHelper = featureAbility.acquireDataAbilityHelper( 160 urivar 161 ); 162 ``` 1632. 构建数据库相关的RDB数据。 164 ```js 165 var valuesBucket = {"name": "gaolu"} 166 var da = new ohos_data_ability.DataAbilityPredicates() 167 var valArray =new Array("value1"); 168 var cars = new Array({"batchInsert1" : "value1",}); 169 ``` 1703. 调用insert方法向指定的Data子模块插入数据。 171 ```js 172 // callback方式调用: 173 DAHelper.insert( 174 urivar, 175 valuesBucket, 176 (error, data) => { 177 console.log("DAHelper insert result: " + data) 178 } 179 ); 180 ``` 181 182 ```js 183 // promise方式调用: 184 var datainsert = await DAHelper.insert( 185 urivar, 186 valuesBucket 187 ); 188 ``` 1894. 调用delete方法删除Data子模块中指定的数据。 190 ```js 191 // callback方式调用: 192 DAHelper.delete( 193 urivar, 194 da, 195 (error, data) => { 196 console.log("DAHelper delete result: " + data) 197 } 198 ); 199 ``` 200 201 ```js 202 // promise方式调用: 203 var datadelete = await DAHelper.delete( 204 urivar, 205 da, 206 ); 207 ``` 2085. 调用update方法更新指定Data子模块中的数据。 209 ```js 210 // callback方式调用: 211 DAHelper.update( 212 urivar 213 valuesBucket, 214 da, 215 (error, data) => { 216 console.log("DAHelper update result: " + data) 217 } 218 ); 219 ``` 220 221 ```js 222 // promise方式调用: 223 var dataupdate = await DAHelper.update( 224 urivar, 225 valuesBucket, 226 da, 227 ); 228 ``` 2296. 调用query方法在指定的Data子模块中查找数据。 230 ```js 231 // callback方式调用: 232 DAHelper.query( 233 urivar, 234 valArray, 235 da, 236 (error, data) => { 237 console.log("DAHelper query result: " + data) 238 } 239 ); 240 ``` 241 242 ```js 243 // promise方式调用: 244 var dataquery = await DAHelper.query( 245 urivar, 246 valArray, 247 da 248 ); 249 ``` 2507. 调用batchInsert方法向指定的数据子模块批量插入数据。 251 ```js 252 // callback方式调用: 253 DAHelper.batchInsert( 254 urivar, 255 cars, 256 (error, data) => { 257 console.log("DAHelper batchInsert result: " + data) 258 } 259 ); 260 ``` 261 262 ```js 263 // promise方式调用: 264 var databatchInsert = await DAHelper.batchInsert( 265 urivar, 266 cars 267 ); 268 ``` 2698. 调用executeBatch方法向指定的Data子模块进行数据的批量处理。 270 ```js 271 // callback方式调用: 272 DAHelper.executeBatch( 273 urivar, 274 [ 275 { 276 uri: urivar, 277 type: featureAbility.DataAbilityOperationType.TYPE_INSERT, 278 valuesBucket: {"executeBatch" : "value1",}, 279 predicates: da, 280 expectedCount:0, 281 predicatesBackReferences: null, 282 interrupted:true, 283 } 284 ], 285 (error, data) => { 286 console.log("DAHelper executeBatch result: " + data) 287 } 288 ); 289 ``` 290 291 ```js 292 // promise方式调用: 293 var dataexecuteBatch = await DAHelper.executeBatch( 294 urivar, 295 [ 296 { 297 uri: urivar, 298 type: featureAbility.DataAbilityOperationType.TYPE_INSERT, 299 valuesBucket: 300 { 301 "executeBatch" : "value1", 302 }, 303 predicates: da, 304 expectedCount:0, 305 predicatesBackReferences: null, 306 interrupted:true, 307 } 308 ] 309 ); 310 ``` 311