• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.ts80
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