• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# 分布式数据服务开发指导
2
3## 场景介绍
4
5分布式数据服务主要实现用户设备中应用程序数据内容的分布式同步。当设备1上的应用A在分布式数据库中增、删、改数据后,设备2上的应用A也可以获取到该数据库变化。可在分布式图库、信息、通讯录、文件管理器等场景中使用。
6
7
8## 接口说明
9
10分布式数据相关功能接口请见[分布式键值数据库](../reference/apis/js-apis-distributedKVStore.md)。
11
12**表1** 分布式数据服务关键API功能介绍
13
14| 接口名称                                                     | 描述                                                         |
15| ------------------------------------------------------------ | ------------------------------------------------------------ |
16| createKVManager(config: KVManagerConfig): KVManager | 创建一个`KVManager`对象实例,用于管理数据库对象。            |
17| getKVStore&lt;T extends KVStore&gt;(storeId: string, options: Options, callback: AsyncCallback&lt;T&gt;): void<br/>getKVStore&lt;T extends KVStore&gt;(storeId: string, options: Options): Promise&lt;T&gt; | 指定`Options`和`storeId`,创建并获取指定类型`KVStore`数据库。 |
18| put(key: string, value: Uint8Array\|string\|number\|boolean, callback: AsyncCallback&lt;void&gt;): void<br/>put(key: string, value: Uint8Array\|string\|number\|boolean): Promise&lt;void> | 插入和更新数据。                                             |
19| delete(key: string, callback: AsyncCallback&lt;void&gt;): void<br/>delete(key: string): Promise&lt;void> | 删除数据。                                                   |
20| get(key: string, callback: AsyncCallback&lt;Uint8Array\|string\|boolean\|number&gt;): void<br/>get(key: string): Promise&lt;Uint8Array\|string\|boolean\|number> | 获取数据。                                                   |
21| on(event: 'dataChange', type: SubscribeType, observer: Callback&lt;ChangeNotification&gt;): void<br/>on(event: 'syncComplete', syncCallback: Callback&lt;Array&lt;[string,number]&gt;&gt;): void | 订阅数据库中数据的变化。                                     |
22| sync(deviceIdList: string[], mode: SyncMode, delayMs?: number): void | 在手动模式下,触发数据库同步。                               |
23
24## 开发步骤
25
26以单版本分布式数据库为例,说明开发步骤。
27
281. 导入模块。
29
30   ```js
31   import distributedKVStore from '@ohos.data.distributedKVStore';
32   ```
33
342. 请求权限(同步操作时进行该步骤)。
35
36   需要在`config.json`文件里进行配置请求权限(FA模型),示例代码如下:
37
38    ```json
39    {
40      "module": {
41          "reqPermissions": [
42              {
43                 "name": "ohos.permission.DISTRIBUTED_DATASYNC"
44              }
45          ]
46      }
47    }
48    ```
49
50   Stage模型下的权限请求请参见[权限声明-Stage模型](../security/accesstoken-guidelines.md#stage模型)。
51
52   这个权限还需要在应用首次启动的时候弹窗获取用户授权,可以通过如下代码实现:
53
54    ```js
55    // FA模型
56    import featureAbility from '@ohos.ability.featureAbility';
57
58    function grantPermission() {
59    console.info('grantPermission');
60    let context = featureAbility.getContext();
61    context.requestPermissionsFromUser(['ohos.permission.DISTRIBUTED_DATASYNC'], 666).then((data) => {
62        console.info('success: ${data}');
63    }).catch((error) => {
64        console.error('failed: ${error}');
65    })
66    }
67
68    grantPermission();
69
70    // Stage模型
71    import UIAbility from '@ohos.app.ability.UIAbility';
72
73    let context = null;
74
75    class EntryAbility extends UIAbility {
76      onWindowStageCreate(windowStage) {
77        let context = this.context;
78      }
79    }
80
81    function grantPermission() {
82      let permissions = ['ohos.permission.DISTRIBUTED_DATASYNC'];
83      context.requestPermissionsFromUser(permissions).then((data) => {
84        console.log('success: ${data}');
85      }).catch((error) => {
86        console.error('failed: ${error}');
87      });
88    }
89
90    grantPermission();
91    ```
92
933. 根据配置构造分布式数据库管理类实例。
94
95   1. 根据应用上下文创建`kvManagerConfig`对象。
96   2. 创建分布式数据库管理器实例。
97
98   以下为创建分布式数据库管理器的代码示例:
99
100   ```js
101   // FA模型获取context
102   import featureAbility from '@ohos.ability.featureAbility';
103   let context = featureAbility.getContext();
104
105   // Stage模型获取context
106   import UIAbility from '@ohos.app.ability.UIAbility';
107   let context = null;
108   class EntryAbility extends UIAbility {
109      onWindowStageCreate(windowStage){
110        context = this.context;
111      }
112   }
113
114   let kvManager;
115   try {
116     const kvManagerConfig = {
117       bundleName: 'com.example.datamanagertest',
118       context:context,
119     }
120     kvManager = distributedKVStore.createKVManager(kvManagerConfig);
121     console.log("Succeeded in creating KVManager");
122   } catch (e) {
123     console.error(`Failed to create KVManager.code is ${e.code},message is ${e.message}`);
124   }
125   ```
126
1274. 获取/创建分布式数据库。
128
129   1. 声明需要创建的分布式数据库ID描述。
130   2. 创建分布式数据库,建议关闭自动同步功能(`autoSync:false`),需要同步时主动调用`sync`接口。
131
132   以下为创建分布式数据库的代码示例:
133
134   ```js
135   let kvStore;
136   try {
137     const options = {
138       createIfMissing: true,
139       encrypt: false,
140       backup: false,
141       autoSync: false,
142       kvStoreType: distributedKVStore.KVStoreType.SINGLE_VERSION,
143       securityLevel: distributedKVStore.SecurityLevel.S1
144     };
145     kvManager.getKVStore('storeId', options, function (err, store) {
146       if (err) {
147         console.error(`Failed to get KVStore: code is ${err.code},message is ${err.message}`);
148         return;
149       }
150       console.log('Succeeded in getting KVStore');
151       kvStore = store;
152     });
153   } catch (e) {
154     console.error(`An unexpected error occurred.code is ${e.code},message is ${e.message}`);
155   }
156   ```
157
158   > **说明:**
159   >
160   > 组网设备间同步数据的场景,建议在应用启动时打开分布式数据库,获取数据库的句柄。在该句柄(如示例中的`kvStore`)的生命周期内无需重复创建数据库,可直接使用句柄对数据库进行数据的插入等操作。
161
1625. 订阅分布式数据变化。
163
164   以下为订阅单版本分布式数据库数据变化通知的代码示例:
165
166   ```js
167   try{
168       kvStore.on('dataChange', distributedKVStore.SubscribeType.SUBSCRIBE_TYPE_ALL, function (data) {
169           console.log(`dataChange callback call data: ${data}`);
170       });
171   }catch(e){
172       console.error(`An unexpected error occured.code is ${e.code},message is ${e.message}`);
173   }
174   ```
175
1766. 将数据写入分布式数据库。
177
178   1. 构造需要写入分布式数据库的`Key`(键)和`Value`(值)。
179   2. 将键值数据写入分布式数据库。
180
181   以下为将字符串类型键值数据写入分布式数据库的代码示例:
182
183   ```js
184   const KEY_TEST_STRING_ELEMENT = 'key_test_string';
185   const VALUE_TEST_STRING_ELEMENT = 'value-test-string';
186   try {
187       kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT, function (err,data) {
188           if (err != undefined) {
189               console.error(`Failed to put.code is ${err.code},message is ${err.message}`);
190               return;
191           }
192           console.log("Succeeded in putting");
193       });
194   }catch (e) {
195       console.error(`An unexpected error occurred.code is ${e.code},message is ${e.message}`);
196   }
197   ```
198
1997. 查询分布式数据库数据。
200
201   1. 构造需要从单版本分布式数据库中查询的`Key`(键)。
202   2. 从单版本分布式数据库中获取数据。
203
204   以下为从分布式数据库中查询字符串类型数据的代码示例:
205
206   ```js
207   const KEY_TEST_STRING_ELEMENT = 'key_test_string';
208   const VALUE_TEST_STRING_ELEMENT = 'value-test-string';
209   try {
210       kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT, function (err,data) {
211           if (err != undefined) {
212               console.error(`Failed to put.code is ${err.code},message is ${err.message}`);
213               return;
214           }
215           console.log("Succeeded in putting");
216           kvStore.get(KEY_TEST_STRING_ELEMENT, function (err,data) {
217           if (err != undefined) {
218               console.error(`Failed to get.code is ${err.code},message is ${err.message}`);
219               return;
220           }
221               console.log(`Succeeded in getting data:${data}`);
222           });
223       });
224   }catch (e) {
225       console.error(`Failed to get.code is ${e.code},message is ${e.message}`);
226   }
227   ```
228
2298. 同步数据到其他设备。
230
231   选择同一组网环境下的设备以及同步模式,进行数据同步。
232
233   > **说明**:
234   >
235   > 其中`deviceManager`模块的接口均为系统接口。
236
237   以下为单版本分布式数据库进行数据同步的代码示例:
238
239   ```js
240   import deviceManager from '@ohos.distributedHardware.deviceManager';
241
242   let devManager;
243   // create deviceManager
244   deviceManager.createDeviceManager('bundleName', (err, value) => {
245       if (!err) {
246           devManager = value;
247           // deviceIds由deviceManager调用getTrustedDeviceListSync方法得到
248           let deviceIds = [];
249           if (devManager != null) {
250               var devices = devManager.getTrustedDeviceListSync();
251               for (var i = 0; i < devices.length; i++) {
252                   deviceIds[i] = devices[i].deviceId;
253               }
254           }
255           try{
256               // 1000表示最大延迟时间为1000ms
257               kvStore.sync(deviceIds, distributedKVStore.SyncMode.PUSH_ONLY, 1000);
258           } catch (e) {
259                console.error(`An unexpected error occurred. code is ${e.code},message is ${e.message}`);
260           }
261       }
262   });
263   ```
264
265## 相关实例
266
267针对分布式数据开发,有以下相关实例可供参考:
268
269- [`DistributedCalc`:分布式计算器(JS)(API8)(Full SDK)](https://gitee.com/openharmony/applications_app_samples/tree/OpenHarmony-3.2-Release/common/DistributeCalc)
270- [`DistributedCalc`:分布式计算器(ArkTS)(API8)(Full SDK)](https://gitee.com/openharmony/applications_app_samples/tree/OpenHarmony-3.2-Release/Preset/DistributeCalc)
271- [`DistributedDataGobang`:分布式五子棋(ArkTS)(API9)(Full SDK)](https://gitee.com/openharmony/applications_app_samples/tree/OpenHarmony-3.2-Release/data/DistributedDataGobang)
272- [`DDMQuery`:结果集与谓词(ArkTS)(API8)](https://gitee.com/openharmony/applications_app_samples/tree/OpenHarmony-3.2-Release/data/DDMQuery)
273- [`KvStore`:分布式数据库(ArkTS)(API8)(Full SDK)](https://gitee.com/openharmony/applications_app_samples/tree/OpenHarmony-3.2-Release/data/Kvstore)
274- [分布式数据库(JS)(API8)](https://gitee.com/openharmony/codelabs/tree/master/Data/JsDistributedData)