HarmonyOS学习(十二)——数据管理(一)分布式数据

文章目录

1、分布式数据服务概述

分布式数据服务(Distributed Data Service ,DDS)为应用程序提供不同设备间数据库的分布式协同能力。

通过调用分布式数据接口,应用程序将数据保存到分布式数据库中。通过结合账号,用用和数据库三元组,分布式数据服务对属于不同应用的数据进行隔离,以保证不同应用之间数据不能通过分布式数据服务互相访问。在通过可信认证的设备间,分布式数据服务支持应用数据相互同步,为用户提供在多种终端设备上最终一致的数据访问体验。

2、KV数据模型(键值对数据库)

KV数据模型是key-value数据模型的简称,其数据以键值对的形式进行组织、索引和存储。

3、分布式数据服务的约束和限制
  1. 分布式数据服务的数据模型仅支持KV模型,不支持外键,触发器等关系数据库中的功能。
  2. 设备协同数据库,针对每条记录,Key的长度≤896 Byte,Value的长度<4 MB。
  3. 单版本数据库,针对每条记录,Key的长度≤1 KB,Value的长度<4 MB。
  4. 每个应用程序最多支持同时打开16个键值型分布式数据库。
  5. 分布式数据库与本地数据库的使用场景不同,因此开发者应识别需要在设备间进行同步的数据,并将这些数据保存到分布式数据库中。
  6. 分布式数据服务针对每个应用当前的流控制机制:kvStore的接口一秒最多访问1000次,一分钟最多访问10000次;kvManager的接口一秒最多访问50次,一分钟最多访问500次。
  7. 分布式数据库事件回调方法中不允许进行阻塞操作,例如修改UI操作。
4、接口说明

以下是键值型数据库持久化功能的相关接口,大部分为异步接口。异步接口均有callback和Promise两种返回形式,下表均以callback形式为例。

接口名称 描述
createKVManager(config: KVManagerConfig): KVManager 创建一个KVManager对象实例,用于管理数据库对象。
getKVStore(storeId: string, options: Options, callback: AsyncCallback): void 指定options和storeId,创建并得到指定类型的KVStore数据库。
put(key: string, value: Uint8Array string
get(key: string, callback: AsyncCallback<boolean string
delete(key: string, callback: AsyncCallback): void 从数据库中删除指定键值的数据。
5、分布式数据服务开发步骤
5.1、导入模块
plain 复制代码
import distributedKVStore from '@ohos.data.distributedKVStore';
5.2、构造分布式数据库管理类实例
plain 复制代码
let kvManager: distributedKVStore.KVManager | undefined = undefined;
plain 复制代码
export default class KvStoreDemoAbility extends UIAbility {
  onCreate(want, launchParam) {

    let context = this.context;
    const kvManagerConfig: distributedKVStore.KVManagerConfig = {
      context: context,
      bundleName: 'com.example.datamanagertest'
    }

    try {
      //创建KvManager实例
      kvManager = distributedKVStore.createKVManager(kvManagerConfig)
      hilog.info(0x0000, 'testTag', "Success in create kvmanager");
    } catch (e) {
      let error = e as BusinessError;
      console.error(`Failed to create KVManager. Code:${error.code},message:${error.message}`);
    }

    if (kvManager !== undefined) {
      kvManager = kvManager as distributedKVStore.KVManager;
      //进行后续操作
      //...
    }

  }
}
5.3、获取、创建分布式数据库
plain 复制代码
let kvStore: distributedKVStore.SingleKVStore | undefined = undefined;
try {
  const options: distributedKVStore.Options = {
    createIfMissing: true,
    encrypt: false,
    backup: false,
    autoSync: false,
    // kvStoreType不填时,默认创建多设备协同数据库
    kvStoreType: distributedKVStore.KVStoreType.SINGLE_VERSION,
    // 多设备协同数据库:kvStoreType: distributedKVStore.KVStoreType.DEVICE_COLLABORATION,
    securityLevel: distributedKVStore.SecurityLevel.S1
  };
  kvManager.getKVStore<distributedKVStore.SingleKVStore>('storeId', options, (err, store: distributedKVStore.SingleKVStore) => {
    if (err) {
      console.error(`Failed to get KVStore: Code:${err.code},message:${err.message}`);
      return;
    }
    console.info('Succeeded in getting KVStore.');
    kvStore = store;
    // 请确保获取到键值数据库实例后,再进行相关数据操作
  });
} catch (e) {
  let error = e as BusinessError;
  console.error(`An unexpected error occurred. Code:${error.code},message:${error.message}`);
}
if (kvStore !== undefined) {
  kvStore = kvStore as distributedKVStore.SingleKVStore;
  //进行后续操作
  //...
}
5.4、订阅分布式数据库的数据变化
plain 复制代码
try {
  kvStore.on('dataChange', distributedKVStore.SubscribeType.SUBSCRIBE_TYPE_LOCAL, function (data) {
    console.info('datachange callback data:' + JSON.stringify(data))
  });
} catch (e) {
  console.info('An unexpected error occured .Erroe:${e}')
}
5.5、插入数据到分布式数据库

调用put()方法向键值对数据库插入数据,当key值存在时,put()方法会修改其值,否则会新增一条数据。

plain 复制代码
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, (err) => {
    if (err !== undefined) {
      console.error(`Failed to put data. Code:${err.code},message:${err.message}`);
      return;
    }
    console.info('Succeeded in putting data.');
  });
} catch (e) {
  let error = e as BusinessError;
  console.error(`An unexpected error occurred. Code:${error.code},message:${error.message}`);
}
5.6、查询分布式数据库数据

调用get()方法获取指定键的值

plain 复制代码
try {
  kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT, (err) => {
    if (err !== undefined) {
      console.error(`Failed to put data. Code:${err.code},message:${err.message}`);
      return;
    }
    console.info('Succeeded in putting data.');
    kvStore = kvStore as distributedKVStore.SingleKVStore;
    kvStore.get(KEY_TEST_STRING_ELEMENT, (err, data) => {
      if (err != undefined) {
        console.error(`Failed to get data. Code:${err.code},message:${err.message}`);
        return;
      }
      console.info(`Succeeded in getting data. Data:${data}`);
    });
  });
} catch (e) {
  let error = e as BusinessError;
  console.error(`Failed to get data. Code:${error.code},message:${error.message}`);
}
5.7、删除分布式数据库数据

调用delete()方法删除指定键值的数据

plain 复制代码
try {
  kvStore.put(KEY_TEST_STRING_ELEMENT, VALUE_TEST_STRING_ELEMENT, (err) => {
    if (err !== undefined) {
      console.error(`Failed to put data. Code:${err.code},message:${err.message}`);
      return;
    }
    console.info('Succeeded in putting data.');
    kvStore = kvStore as distributedKVStore.SingleKVStore;
    kvStore.delete(KEY_TEST_STRING_ELEMENT, (err) => {
      if (err !== undefined) {
        console.error(`Failed to delete data. Code:${err.code},message:${err.message}`);
        return;
      }
      console.info('Succeeded in deleting data.');
    });
  });
} catch (e) {
  let error = e as BusinessError;
  console.error(`An unexpected error occurred. Code:${error.code},message:${error.message}`);
}
相关推荐
processflow流程图1 小时前
分布式kettle调度平台v6.4.0新功能介绍
分布式
全栈开发圈1 小时前
干货分享|分布式数据科学工具 Xorbits 的使用
分布式
EterNity_TiMe_1 小时前
【论文复现】(CLIP)文本也能和图像配对
python·学习·算法·性能优化·数据分析·clip
sanguine__1 小时前
java学习-集合
学习
lxlyhwl1 小时前
【STK学习】part2-星座-目标可见性与覆盖性分析
学习
nbsaas-boot1 小时前
如何利用ChatGPT加速开发与学习:以BPMN编辑器为例
学习·chatgpt·编辑器
️ 邪神1 小时前
【Android、IOS、Flutter、鸿蒙、ReactNative 】自定义View
flutter·ios·鸿蒙·reactnative·anroid
CV学术叫叫兽2 小时前
一站式学习:害虫识别与分类图像分割
学习·分类·数据挖掘
我们的五年2 小时前
【Linux课程学习】:进程程序替换,execl,execv,execlp,execvp,execve,execle,execvpe函数
linux·c++·学习
一棵开花的树,枝芽无限靠近你3 小时前
【PPTist】添加PPT模版
前端·学习·编辑器·html