fa-dataability.md 8.6 KB
Newer Older
1
# DataAbility开发指导
Z
zengyawen 已提交
2 3

## Data Ability基本概念
ahjxliubao2's avatar
ahjxliubao2 已提交
4 5 6
基于Data模板的Ability(以下简称“Data”),有助于应用管理其自身和其他应用存储数据的访问,并提供与其他应用共享数据的方法。Data既可用于同设备不同应用的数据共享,也支持跨设备不同应用的数据共享。

Data提供方可以自定义数据的增、删、改、查,以及文件打开等功能,并对外提供这些接口。
Z
zengyawen 已提交
7 8 9

## 创建Data
### 1. Data子系统实现
ahjxliubao2's avatar
ahjxliubao2 已提交
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
1. 需要实现Data中Insert,Query,Update,Delete接口的业务内容.保证能够满足数据库存储业务的基本需求.BatchInsert与ExecuteBatch接口已经在系统中实现遍历逻辑,依赖Insert,Query,Update,Delete接口逻辑,来实现数据的批量处理.
2. Data中相关生命周期说明如下:

   - onInitialized

     在Ability初始化调用,通过此回调方法执行rdb等初始化操作。

   - update

     更新数据库中的数据。

   - query

     查询数据库中的数据。

   - delete

     删除一条或多条数据。

   - normalizeUri

     对uri进行规范化。一个规范化的uri可以支持跨设备使用、持久化、备份和还原等,当上下文改变时仍然可以引用到相同的数据项。

   - batchInsert

     向数据库中插入多条数据。

   - denormalizeUri

     将一个由normalizeUri生产的规范化uri转换成非规范化的uri。

   - insert

     向数据中插入一条数据。

   - openFile

     打开一个文件。

   - getFileTypes

     获取文件的MIME类型。

   - getType

     获取uri指定数据相匹配的MIME类型。

   - executeBatch
   
     批量操作数据库中的数据。

   - call

     自定义方法。
 

   创建Data的代码示例如下:

   ```javascript
    import dataAbility from '@ohos.data.dataability'
    import dataRdb from '@ohos.data.rdb'
    
    const TABLE_NAME = 'book'
    const STORE_CONFIG = { name: 'book.db', encryptKey: new Uint8Array([]) }
    const SQL_CREATE_TABLE = 'CREATE TABLE IF NOT EXISTS book(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER, introduction TEXT NOT NULL)'
    let rdbStore =  undefined
    
    export default {
        onInitialized(abilityInfo) {
            console.info('DataAbility onInitialized, abilityInfo:' + abilityInfo.bundleName)
            dataRdb.getRdbStore(STORE_CONFIG, 1, (err, store) => {
                console.info('DataAbility getRdbStore callback')
                store.executeSql(SQL_CREATE_TABLE, [])
                rdbStore = store
            });
        },
        insert(uri, valueBucket, callback) {
            console.info('DataAbility insert start')
            rdbStore.insert(TABLE_NAME, valueBucket, callback)
        },
        batchInsert(uri, valueBuckets, callback) {
            console.info('DataAbility batch insert start')
            for (let i = 0;i < valueBuckets.length; i++) {
                console.info('DataAbility batch insert i=' + i)
                if (i < valueBuckets.length - 1) {
                    rdbStore.insert(TABLE_NAME, valueBuckets[i], (num: number) => {
                        console.info('DataAbility batch insert ret=' + num)
                    })
                } else {
                    rdbStore.insert(TABLE_NAME, valueBuckets[i], callback)
                }
            }
        },
        query(uri, columns, predicates, callback) {
            console.info('DataAbility query start')
            let rdbPredicates = dataAbility.createRdbPredicates(TABLE_NAME, predicates)
            rdbStore.query(rdbPredicates, columns, callback)
        },
        update(uri, valueBucket, predicates, callback) {
            console.info('DataAbilityupdate start')
            let rdbPredicates = dataAbility.createRdbPredicates(TABLE_NAME, predicates)
            rdbStore.update(valueBucket, rdbPredicates, callback)
        },
        delete(uri, predicates, callback) {
            console.info('DataAbilitydelete start')
            let rdbPredicates = dataAbility.createRdbPredicates(TABLE_NAME, predicates)
            rdbStore.delete(rdbPredicates, callback)
        }
    };

   ```
Z
zengyawen 已提交
121 122 123 124 125 126 127 128 129 130 131 132 133 134 135


### 2. 子系统配置

| Json重要字段  | 备注说明                                                     |
| ------------- | ------------------------------------------------------------ |
| "name"        | Ability名子,对应Ability派生的Data类名                        |
| "type"        | Ability类型,Data对应的Ability类型未"data"                    |
| "uri"         | 通信使用的URI                                                |
| "visible"     | 对其他应用是否可见, 设置为true时, Data才能与其他应用进行通信传输数据 |

**config.json配置样例**

```json
"abilities":[{
ahjxliubao2's avatar
ahjxliubao2 已提交
136
    "srcPath": "DataAbility",
Z
zengyawen 已提交
137
    "name": ".DataAbility",
ahjxliubao2's avatar
ahjxliubao2 已提交
138 139 140
    "icon": "$media:icon",
    "srcLanguage": "ets",
    "description": "$string:description_dataability",
Z
zengyawen 已提交
141
    "type": "data",
ahjxliubao2's avatar
ahjxliubao2 已提交
142 143
    "visible": true,
    "uri": "dataability://ohos.samples.etsdataability.DataAbility"    
Z
zengyawen 已提交
144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294
}]
```

## 访问Data
### 1 JS应用开发前准备
基础依赖包:
    1. @ohos.ability.featureAbility
    2. @ohos.data.dataability
    3. @ohos.data.rdb
与Data子系统通信的Uri字符串

### 2 JS应用开发接口
工具接口类对象创建
```js
// 作为参数传递的Uri,与config中定义的Uri的区别是多了一个"/",是因为作为参数传递的uri中,在第二个与第三个"/"中间,存在一个DeviceID的参数
var urivar = "dataability:///com.ix.DataAbility"
var DAHelper = featureAbility.acquireDataAbilityHelper(
    urivar
);
```
数据库相关的rdb数据构建
```js
var valuesBucket = {"name": "gaolu"}
var da = new ohos_data_ability.DataAbilityPredicates()
var valArray =new Array("value1");
var cars = new Array({"batchInsert1" : "value1",});
```
向指定的Data子系统插入数据,inster调用
```js
// callbacke方式调用:
DAHelper.insert(
    urivar,
    valuesBucket,
    (error, data) => {
        expect(typeof(data)).assertEqual("number")
    }
);
// promise方式调用:
var datainsert = await DAHelper.insert(
    urivar,
    valuesBucket
);
```
删除Data子系统中指定的数据, delete调用
```js
// callbacke方式调用:
DAHelper.delete(
    urivar,
    da,
    (error, data) => {
        expect(typeof(data)).assertEqual("number")
    }
);
// promise方式调用:
var datadelete = await DAHelper.delete(
    urivar,
    da,
);
```
更新指定Data子系统中的数据, update调用
```js
// callbacke方式调用:
DAHelper.update(
    urivar
    valuesBucket,
    da,
    (error, data) => {
        expect(typeof(data)).assertEqual("number")
    }
);
// promise方式调用:
var dataupdate = await DAHelper.update(
    urivar,
    valuesBucket,
    da,
);
```
在指定的Data子系统中查找数据,query调用
```js
// callbacke方式调用:
DAHelper.query(
    urivar,
    valArray,
    da,
    (error, data) => {
        expect(typeof(data)).assertEqual("object")
    }
);
// promise方式调用:
var dataquery = await DAHelper.query(
    urivar,
    valArray,
    da
);
```
向指定的数据子系统批量插入数据,batchInsert调用
```js
// callbacke方式调用:
DAHelper.batchInsert(
    urivar,
    cars,
    (error, data) => {
        expect(typeof(data)).assertEqual("number")
    }
);
// promise方式调用:
var databatchInsert = await DAHelper.batchInsert(
    urivar,
    cars
);
```
向指定的Data子系统进行数据的批量处理,executeBatch调用
```js
// callbacke方式调用:
DAHelper.executeBatch(
    urivar,
    [
        {
            uri: urivar,
            type: featureAbility.DataAbilityOperationType.TYPE_INSERT,
            valuesBucket: {"executeBatch" : "value1",},
            predicates: da,
            expectedCount:0,
            PredicatesBackReferences: {},
            interrupted:true,
        }
    ],
    (error, data) => {
        expect(typeof(data)).assertEqual("object")
    }
);
// promise方式调用:
var dataexecuteBatch = await DAHelper.executeBatch(
    urivar,
    [
        {
            uri: urivar,
            type: featureAbility.DataAbilityOperationType.TYPE_INSERT,
            valuesBucket:
            {
                "executeBatch" : "value1",
            },
            predicates: da,
            expectedCount:0,
            PredicatesBackReferences: {},
            interrupted:true,
        }
    ]
);
```

ahjxliubao2's avatar
ahjxliubao2 已提交
295 296 297 298 299 300 301 302 303 304 305
## 开发实例

针对dataAbility开发,有以下示例工程可供参考:

- [eTSDataAbility](https://gitee.com/openharmony/app_samples/tree/master/ability/eTSDataAbility)

本示例eTSDataAbility中:

在DataAbility目录中的data.ts文件创建一个Data实例。

在MainAbility目录中封装了访问Data的流程。