fa-dataability.md 7.9 KB
Newer Older
1
# DataAbility开发指导
ahjxliubao2's avatar
ahjxliubao2 已提交
2
## 场景介绍
ahjxliubao2's avatar
ahjxliubao2 已提交
3 4 5
基于Data模板的Ability(以下简称“Data”),有助于应用管理其自身和其他应用存储数据的访问,并提供与其他应用共享数据的方法。Data既可用于同设备不同应用的数据共享,也支持跨设备不同应用的数据共享。

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

ahjxliubao2's avatar
ahjxliubao2 已提交
7 8 9 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
## 接口说明

**表1** 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

1.需要实现Data中Insert,Query,Update,Delete接口的业务内容.保证能够满足数据库存储业务的基本需求.BatchInsert与ExecuteBatch接口已经在系统中实现遍历逻辑,依赖Insert,Query,Update,Delete接口逻辑,来实现数据的批量处理.

创建Data的代码示例如下:

```javascript
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)
ahjxliubao2's avatar
ahjxliubao2 已提交
58 59
            }
        }
ahjxliubao2's avatar
ahjxliubao2 已提交
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
    },
    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 已提交
77

ahjxliubao2's avatar
ahjxliubao2 已提交
78
```
Z
zengyawen 已提交
79

ahjxliubao2's avatar
ahjxliubao2 已提交
80
2.子系统配置
Z
zengyawen 已提交
81 82 83 84 85 86 87 88 89 90 91 92

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

**config.json配置样例**

```json
"abilities":[{
ahjxliubao2's avatar
ahjxliubao2 已提交
93
    "srcPath": "DataAbility",
Z
zengyawen 已提交
94
    "name": ".DataAbility",
ahjxliubao2's avatar
ahjxliubao2 已提交
95 96 97
    "icon": "$media:icon",
    "srcLanguage": "ets",
    "description": "$string:description_dataability",
Z
zengyawen 已提交
98
    "type": "data",
ahjxliubao2's avatar
ahjxliubao2 已提交
99 100
    "visible": true,
    "uri": "dataability://ohos.samples.etsdataability.DataAbility"    
Z
zengyawen 已提交
101 102 103
}]
```

ahjxliubao2's avatar
ahjxliubao2 已提交
104 105 106
### 访问Data
1.JS应用开发前准备

Z
zengyawen 已提交
107 108 109 110 111 112
基础依赖包:
    1. @ohos.ability.featureAbility
    2. @ohos.data.dataability
    3. @ohos.data.rdb
与Data子系统通信的Uri字符串

ahjxliubao2's avatar
ahjxliubao2 已提交
113 114
2.JS应用开发接口

Z
zengyawen 已提交
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 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
工具接口类对象创建
```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 已提交
254 255 256 257 258 259 260 261 262 263 264
## 开发实例

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

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

本示例eTSDataAbility中:

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

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