1、简 述
❓ 什么是键值型数据库
键值型数据库(KV-Store)是一种非关系型数据库,其数据以“键值”对的形式进行组织、索引和存储,其中“键”作为唯一标识符。 键值型数据库适合很少数据关系和业务关系的业务数据存储。 另外,因键值型数据库在分布式场景中降低了解决数据库版本兼容问题的复杂度,和数据同步过程中冲突解决的复杂度而被广泛使用。相比于关系型数据库,更容易做到跨设备跨版本兼容。 |
当需要存储的数据没有复杂的关系模型,比如存储商品名称及对应价格、员工工号及今日是否已出勤等,由于数据复杂度低,更容易兼容不同数据库版本和设备类型,因此推荐使用键值型数据库持久化此类数据。
📢 使用键值型数据库时,需要注意以下几点:
-
-
设备协同数据库,针对每条记录,Key的长度≤896 Byte,Value的长度<4 MB。
-
单版本数据库,针对每条记录,Key的长度≤1 KB,Value的长度<4 MB。
-
每个应用程序最多支持同时打开16个键值型分布式数据库。
-
键值型数据库事件回调方法中不允许进行阻塞操作,例如修改UI组件。
-
单个数据库最多支持注册8个订阅数据变化的回调。
-
键值型数据库不支持应用程序自定义冲突解决策略。
-
2、键值型数据库的基本使用
键值型数据库的能力主要是由 @ohos.data.distributedKVStore 模块提供,实现不同设备间数据库的分布式协同能力。通过调用分布式键值数据库各个接口,应用程序可将数据保存到分布式键值数据库中,并可对分布式键值数据库中的数据进行增加、删除、修改、查询、同步等操作。
该模块提供以下分布式键值数据库相关的常用功能:
-
-
KVManager:分布式键值数据库管理实例,用于获取数据库的相关信息。
-
KVStoreResultSet:提供获取数据库结果集的相关方法,包括查询和移动数据读取位置等。
-
Query:使用谓词表示数据库查询,提供创建Query实例、查询数据库中的数据和添加谓词的方法。
-
SingleKVStore:单版本分布式键值数据库,不对数据所属设备进行区分,提供查询数据和同步数据的方法。
-
DeviceKVStore:设备协同数据库,继承自SingleKVStore,以设备维度对数据进行区分,提供查询数据和同步数据的方法。
-
以下是键值型数据库持久化功能的相关接口,大部分为异步接口。异步接口均有callback和Promise两种返回形式,下面均以callback形式为例:
// 创建一个KVManager对象实例,用于管理数据库对象。
createKVManager(config: KVManagerConfig): KVManager
// 指定options和storeId,创建并得到指定类型的KVStore数据库。
getKVStore<T>(storeId: string, options: Options, callback: AsyncCallback<T>): void
// 添加指定类型的键值对到数据库。
put(key: string, value: Uint8Array | string | number | boolean, callback: AsyncCallback<void>): void
// 获取指定键的值。
get(key: string, callback: AsyncCallback<boolean | string | number | Uint8Array>): void
// 从数据库中删除指定键值的数据。
delete(key: string, callback: AsyncCallback<void>): void
// 通过storeId的值关闭指定的分布式键值数据库。
closeKVStore(appId: string, storeId: string, callback: AsyncCallback<void>): void
// 通过storeId的值删除指定的分布式键值数据库。
deleteKVStore(appId: string, storeId: string, callback: AsyncCallback<void>): void
使用示例
👉🏻 step 1:若要使用键值型数据库,首先要获取一个KVManager实例,用于管理数据库对象。示例代码如下所示(代码13 ~ 25行):
// 导入模块
import { distributedKVStore } from '@kit.ArkData';
import { window } from '@kit.ArkUI';
import { UIAbility } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
let kvManager: distributedKVStore.KVManager | undefined = undefined;
export default class EntryAbility extends UIAbility {
onCreate() {
let context = this.context;
const kvManagerConfig: distributedKVStore.KVManagerConfig = {
context: context,
bundleName: 'com.example.datamanagertest'
};
try {
// 创建KVManager实例
kvManager = distributedKVStore.createKVManager(kvManagerConfig);
console.info('Succeeded in creating 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;
//进行后续操作
//...
}
👉🏻 step 2:基于step 1创建的kvManager,我们可以创建并获取键值数据库。示例代码如下所示:
let kvStore: distributedKVStore.SingleKVStore | undefi