分布式数据服务开发指导


分布式数据服务开发指导

场景介绍

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

接口说明

分布式数据相关功能接口请见分布式键值数据库

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

接口名称 描述
createKVManager(config: KVManagerConfig, callback: AsyncCallback<KVManager>): void
createKVManager(config: KVManagerConfig): Promise<KVManager>
创建一个KVManager对象实例,用于管理数据库对象。
getKVStore<TextendsKVStore>(storeId: string, options: Options, callback: AsyncCallback<T>): void
getKVStore<TextendsKVStore>(storeId: string, options: Options): Promise<T>
指定OptionsstoreId,创建并获取指定类型KVStore数据库。
put(key: string, value: Uint8Array|string|number|boolean, callback: AsyncCallback<void>): void
put(key: string, value: Uint8Array|string|number|boolean): Promise<void>
插入和更新数据。
delete(key: string, callback: AsyncCallback<void>): void
delete(key: string): Promise<void>
删除数据。
get(key: string, callback: AsyncCallback<Uint8Array|string|boolean|number>): void
get(key: string): Promise<Uint8Array|string|boolean|number>
查询数据。
on(event: 'dataChange', type: SubscribeType, observer: Callback<ChangeNotification>): void
on(event: 'syncComplete', syncCallback: Callback<Array<[string,number]>>): void
订阅数据库中数据的变化。
sync(deviceIdList: string[], mode: SyncMode, allowedDelayMs?: number): void 在手动模式下,触发数据库同步。

开发步骤

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

  1. 导入模块。

    import distributedKVStore from '@ohos.data.distributedKVStore';
    
    1
  2. 请求权限(同步操作时进行该步骤)。

    需要在config.json文件里进行配置请求权限(FA模型),示例代码如下:

    {
      "module": {
          "reqPermissions": [
              {
                 "name": "ohos.permission.DISTRIBUTED_DATASYNC"
              }
          ]
      }
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9

    Stage模型下的权限请求请参见权限声明-Stage模型

    这个权限还需要在应用首次启动的时候弹窗获取用户授权,可以通过如下代码实现:

    // FA模型
    import featureAbility from '@ohos.ability.featureAbility';
    
    function grantPermission() {
    console.info('grantPermission');
    let context = featureAbility.getContext();
    context.requestPermissionsFromUser(['ohos.permission.DISTRIBUTED_DATASYNC'], 666).then((data) => {
        console.info('success: ${data}');
    }).catch((error) => {
        console.info('failed: ${error}');
    })
    }
    
    grantPermission();
    
    // Stage模型
    import Ability from '@ohos.application.Ability';
    
    let context = null;
    
    function grantPermission() {
    class MainAbility extends Ability {
        onWindowStageCreate(windowStage) {
        let context = this.context;
        }
    }
    
    let permissions = ['ohos.permission.DISTRIBUTED_DATASYNC'];
    context.requestPermissionsFromUser(permissions).then((data) => {
        console.log('success: ${data}');
    }).catch((error) => {
        console.log('failed: ${error}');
    });
    }
    
    grantPermission();
    
    1
    2
    3
    4
    5
    6
    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
  3. 根据配置构造分布式数据库管理类实例。

    1. 根据应用上下文创建kvManagerConfig对象。
    2. 创建分布式数据库管理器实例。

    以下为创建分布式数据库管理器的代码示例:

    // FA模型获取context
    import featureAbility from '@ohos.ability.featureAbility';
    let context = featureAbility.getContext();
    
    // Stage模型获取context
    import AbilityStage from '@ohos.application.Ability';
    let context = null;
    class MainAbility extends AbilityStage{
       onWindowStageCreate(windowStage){
         context = this.context;
       }
    }
    
    let kvManager;
    try {
      const kvManagerConfig = {
        bundleName: 'com.example.datamanagertest',
        context:context,
      }
      distributedKVStore.createKVManager(kvManagerConfig, function (err, manager) {
        if (err) {
          console.error(`Failed to createKVManager.code is ${err.code},message is ${err.message}`);
          return;
        }
        console.log('Succeeded in creating KVManager');
        kvManager = manager;
      });
    } catch (e) {
      console.error(`An unexpected error occurred.code is ${e.code},message is ${e.message}`);
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
  4. 获取/创建分布式数据库。

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

    以下为创建分布式数据库的代码示例:

    let kvStore;
    try {
      const options = {
        createIfMissing: true,
        encrypt: false,
        backup: false,
        autoSync: false,
        kvStoreType: distributedKVStore.KVStoreType.SINGLE_VERSION,
        securityLevel: distributedKVStore.SecurityLevel.S1
      };
      kvManager.getKVStore('storeId', options, function (err, store) {
        if (err) {
          console.error(`Failed to get KVStore: code is ${err.code},message is ${err.message}`);
          return;
        }
        console.log('Succeeded in getting KVStore');
        kvStore = store;
      });
    } catch (e) {
      console.error(`An unexpected error occurred.code is ${e.code},message is ${e.message}`);
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21

    说明:

    组网设备间同步数据的场景,建议在应用启动时打开分布式数据库,获取数据库的句柄。在该句柄(如示例中的kvStore)的生命周期内无需重复创建数据库,可直接使用句柄对数据库进行数据的插入等操作。

  5. 订阅分布式数据变化。

    以下为订阅单版本分布式数据库数据变化通知的代码示例:

    try{
        kvStore.on('dataChange', distributedKVStore.SubscribeType.SUBSCRIBE_TYPE_ALL, function (data) {
            console.log(`dataChange callback call data: ${data}`);
        });
    }catch(e){
        console.error(`An unexpected error occured.code is ${e.code},message is ${e.message}`);
    }
    
    1
    2
    3
    4
    5
    6
    7
  6. 将数据写入分布式数据库。

    1. 构造需要写入分布式数据库的Key(键)和Value(值)。
    2. 将键值数据写入分布式数据库。

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

    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.error(`Failed to put.code is ${err.code},message is ${err.message}`);
                return;
            }
            console.log("Succeeded in putting");
        });
    }catch (e) {
        console.error(`An unexpected error occurred.code is ${e.code},message is ${e.message}`);
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
  7. 查询分布式数据库数据。

    1. 构造需要从单版本分布式数据库中查询的Key(键)。
    2. 从单版本分布式数据库中获取数据。

    以下为从分布式数据库中查询字符串类型数据的代码示例:

    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.error(`Failed to put.code is ${err.code},message is ${err.message}`);
                return;
            }
            console.log("Succeeded in putting");
            kvStore.get(KEY_TEST_STRING_ELEMENT, function (err,data) {
            if (err != undefined) {
                console.error(`Failed to get.code is ${err.code},message is ${err.message}`);
                return;
            }
                console.log(`Succeeded in getting data:${data}`);
            });
        });
    }catch (e) {
        console.error(`Failed to get.code is ${e.code},message is ${e.message}`);
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
  8. 同步数据到其他设备。

    选择同一组网环境下的设备以及同步模式,进行数据同步。

    说明

    其中deviceManager模块的接口均为系统接口。

    以下为单版本分布式数据库进行数据同步的代码示例:

    import deviceManager from '@ohos.distributedHardware.deviceManager';
    
    let devManager;
    // create deviceManager
    deviceManager.createDeviceManager('bundleName', (err, value) => {
        if (!err) {
            devManager = value;
            // deviceIds由deviceManager调用getTrustedDeviceListSync方法得到
            let deviceIds = [];
            if (devManager != null) {
                var devices = devManager.getTrustedDeviceListSync();
                for (var i = 0; i < devices.length; i++) {
                    deviceIds[i] = devices[i].deviceId;
                }
            }
            try{
                // 1000表示最大延迟时间为1000ms
                kvStore.sync(deviceIds, distributedKVStore.SyncMode.PUSH_ONLY, 1000);
            } catch (e) {
                 console.error(`An unexpected error occurred. code is ${e.code},message is ${e.message}`);
            }
        }
    });
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23

相关实例

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