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<T extends KVStore>(storeId: string, options: Options, callback: AsyncCallback<T>): void<br/>getKVStore<T extends KVStore>(storeId: string, options: Options): Promise<T> | 指定`Options`和`storeId`,创建并获取指定类型`KVStore`数据库。 | 18| put(key: string, value: Uint8Array\|string\|number\|boolean, callback: AsyncCallback<void>): void<br/>put(key: string, value: Uint8Array\|string\|number\|boolean): Promise<void> | 插入和更新数据。 | 19| delete(key: string, callback: AsyncCallback<void>): void<br/>delete(key: string): Promise<void> | 删除数据。 | 20| get(key: string, callback: AsyncCallback<Uint8Array\|string\|boolean\|number>): void<br/>get(key: string): Promise<Uint8Array\|string\|boolean\|number> | 获取数据。 | 21| on(event: 'dataChange', type: SubscribeType, observer: Callback<ChangeNotification>): void<br/>on(event: 'syncComplete', syncCallback: Callback<Array<[string,number]>>): 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)