database-mdds-guidelines.md 8.6 KB
Newer Older
Z
zengyawen 已提交
1 2 3 4 5 6 7 8
# 分布式数据服务开发指导

## 场景介绍

分布式数据服务主要实现用户设备中应用程序数据内容的分布式同步。当设备1上的应用A在分布式数据库中增、删、改数据后,设备2上的应用A也可以获取到该数据库变化。可在分布式图库、信息、通讯录、文件管理器等场景中使用。


## 接口说明
9
具体分布式数据相关功能接口请见[分布式数据管理](../reference/apis/js-apis-distributed-data.md)
Z
zengyawen 已提交
10 11 12 13


**表1** 分布式数据服务关键API功能介绍

14 15
| 接口名称                                                     | 描述                                            |
| ------------------------------------------------------------ | ----------------------------------------------- |
16 17 18 19 20 21 22
| createKVManager(config: KVManagerConfig, callback: AsyncCallback&lt;KVManager&gt;): void<br/>createKVManager(config: KVManagerConfig): Promise&lt;KVManager> | 创建一个`KVManager`对象实例,用于管理数据库对象。 |
| getKVStore&lt;TextendsKVStore&gt;(storeId: string, options: Options, callback: AsyncCallback&lt;T&gt;): void<br/>getKVStore&lt;TextendsKVStore&gt;(storeId: string, options: Options): Promise&lt;T&gt; | 指定`Options``storeId`,创建并获取`KVStore`数据库。 |
| 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> | 插入和更新数据。                                |
| delete(key: string, callback: AsyncCallback&lt;void&gt;): void<br/>delete(key: string): Promise&lt;void> | 删除数据。                                      |
| get(key: string, callback: AsyncCallback&lt;Uint8Array\|string\|boolean\|number&gt;): void<br/>get(key: string): Promise&lt;Uint8Array\|string\|boolean\|number> | 查询数据。                                      |
| 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 | 订阅数据库中数据的变化。                        |
| sync(deviceIdList: string[], mode: SyncMode, allowedDelayMs?: number): void | 在手动模式下,触发数据库同步。                  |
Z
zengyawen 已提交
23 24


Z
zengyawen 已提交
25 26 27 28 29 30 31


## 开发步骤

以单版本分布式数据库为例,说明开发步骤。

1. 导入模块。
32

33
   ```js
Z
zengyawen 已提交
34 35 36 37
   import distributedData from '@ohos.data.distributedData';
   ```

2. 根据配置构造分布式数据库管理类实例。
38

39
   1. 根据应用上下文创建`kvManagerConfig`对象。
Z
zengyawen 已提交
40 41 42
   2. 创建分布式数据库管理器实例。

   以下为创建分布式数据库管理器的代码示例:
43
   ```js
Z
zengyawen 已提交
44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
   let kvManager;
   try {
       const kvManagerConfig = {
           bundleName : 'com.example.datamanagertest',
           userInfo : {
               userId : '0',
               userType : distributedData.UserType.SAME_USER_ID
           }
       }
       distributedData.createKVManager(kvManagerConfig, function (err, manager) {
           if (err) {
               console.log("createKVManager err: "  + JSON.stringify(err));
               return;
           }
           console.log("createKVManager success");
           kvManager = manager;
       });
   } catch (e) {
       console.log("An unexpected error occurred. Error:" + e);
   }
   ```

3. 获取/创建分布式数据库。
67

Z
zengyawen 已提交
68
   1. 声明需要创建的分布式数据库ID描述。
69
   2. 创建分布式数据库,建议关闭自动同步功能(`autoSync:false`),需要同步时主动调用`sync`接口。
Z
zengyawen 已提交
70 71

   以下为创建分布式数据库的代码示例:
72
   ```js
Z
zengyawen 已提交
73 74 75 76 77 78 79 80
   let kvStore;
   try {
       const options = {
           createIfMissing : true,
           encrypt : false,
           backup : false,
           autoSync : false,
           kvStoreType : distributedData.KVStoreType.SINGLE_VERSION,
81
           securityLevel : distributedData.SecurityLevel.S0,
Z
zengyawen 已提交
82 83 84 85 86 87 88 89 90 91 92 93 94 95
       };
       kvManager.getKVStore('storeId', options, function (err, store) {
           if (err) {
               console.log("getKVStore err: "  + JSON.stringify(err));
               return;
           }
           console.log("getKVStore success");
           kvStore = store;
       });
   } catch (e) {
       console.log("An unexpected error occurred. Error:" + e);
   }
   ```

96 97 98 99
   > **说明:**
   >
   > 组网设备间同步数据的场景,建议在应用启动时打开分布式数据库,获取数据库的句柄。在该句柄(如示例中的`kvStore`)的生命周期内无需重复创建数据库,可直接使用句柄对数据库进行数据的插入等操作。
   
Z
zengyawen 已提交
100
4. 订阅分布式数据变化。
101

Z
zengyawen 已提交
102
   以下为订阅单版本分布式数据库数据变化通知的代码示例:
103
   ```js
Z
zengyawen 已提交
104 105 106 107 108 109
   kvStore.on('dataChange', distributedData.SubscribeType.SUBSCRIBE_TYPE_ALL, function (data) {
       console.log("dataChange callback call data: " + JSON.stringify(data));
   });
   ```

5. 将数据写入分布式数据库。
110

111
   1. 构造需要写入分布式数据库的`Key`(键)和`Value`(值)。
Z
zengyawen 已提交
112 113 114 115
   2. 将键值数据写入分布式数据库。

   以下为将字符串类型键值数据写入分布式数据库的代码示例:

116
   ```js
Z
zengyawen 已提交
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
   const KEY_TEST_STRING_ELEMENT = 'key_test_string';
   const VALUE_TEST_STRING_ELEMENT = 'value-test-string';
   try {
       kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT, function (err,data) {
           if (err != undefined) {
               console.log("put err: " + JSON.stringify(err));
               return;
           }
           console.log("put success");
       });
   }catch (e) {
       console.log("An unexpected error occurred. Error:" + e);
   }
   ```

6. 查询分布式数据库数据。
133

134
   1. 构造需要从单版本分布式数据库中查询的`Key`(键)。
Z
zengyawen 已提交
135 136 137
   2. 从单版本分布式数据库中获取数据。

   以下为从分布式数据库中查询字符串类型数据的代码示例:
138
   ```js
Z
zengyawen 已提交
139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157
   const KEY_TEST_STRING_ELEMENT = 'key_test_string';
   const VALUE_TEST_STRING_ELEMENT = 'value-test-string';
   try {
       kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT, function (err,data) {
           if (err != undefined) {
               console.log("put err: " + JSON.stringify(err));
               return;
           }
           console.log("put success");
           kvStore.get(KEY_TEST_STRING_ELEMENT, function (err,data) {
               console.log("get success data: " + data);
           });
       });
   }catch (e) {
       console.log("An unexpected error occurred. Error:" + e);
   }
   ```

7. 同步数据到其他设备。
158

159
   选择同一组网环境下的设备以及同步模式,进行数据同步。
Z
zengyawen 已提交
160

161 162 163 164 165
   > **说明**:
   >
   > 其中`deviceManager`模块的接口均为系统接口。
   
   以下为单版本分布式数据库进行数据同步的代码示例:
166
   ```js
Z
zengyawen 已提交
167 168 169 170 171 172 173
   import deviceManager from '@ohos.distributedHardware.deviceManager';
   
   let devManager;
   // create deviceManager
   deviceManager.createDeviceManager("bundleName", (err, value) => {
       if (!err) {
           devManager = value;
174
           // deviceIds由deviceManager调用getTrustedDeviceListSync方法得到
175 176
           let deviceIds = [];
           if (devManager != null) {
177 178 179
               var devices = devManager.getTrustedDeviceListSync();
               for (var i = 0; i < devices.length; i++) {
                   deviceIds[i] = devices[i].deviceId;
180 181
               }
           }
182
           try{
183
               // 1000表示最大延迟时间为1000ms
184
               kvStore.sync(deviceIds, distributedData.SyncMode.PUSH_ONLY, 1000);
185
           }catch (e) {
186
                console.log("An unexpected error occurred. Error:" + e);
187
           }
Z
zengyawen 已提交
188 189 190
       }
   });
   ```
191
## 相关实例
192

193
针对分布式数据开发,有以下相关实例可供参考:
194

195 196
- [`DistributedCalc`:分布式计算器(JS)(API8)(Full SDK)](https://gitee.com/openharmony/applications_app_samples/tree/master/common/DistributeCalc)
- [`DistributedCalc`:分布式计算器(eTS)(API8)(Full SDK)](https://gitee.com/openharmony/applications_app_samples/tree/master/Preset/DistributeCalc)
197 198 199
- [`DistributedDataGobang`:分布式五子棋(eTS)(API9)(Full SDK)](https://gitee.com/openharmony/applications_app_samples/tree/master/data/DistributedDataGobang)
- [`DDMQuery`:结果集与谓词(eTS)(API8)](https://gitee.com/openharmony/applications_app_samples/tree/master/data/DDMQuery)
- [`KvStore`:分布式数据库(eTS)(API8)(Full SDK)](https://gitee.com/openharmony/applications_app_samples/tree/master/data/Kvstore)
200
- [分布式数据库(JS)(API8)](https://gitee.com/openharmony/codelabs/tree/master/Data/JsDistributedData)