
回复
一、使用场景
当我们需要对数据进行持久化处理时,如果数据没有复杂的关系模型,推荐使用键值型数据库对数据做持久化处理。
二、键值型数据库常用方法
createKVManager:创建KVManager管理数据库对象实例
getKVStore:获取KVStore数据库
put(key,value):向数据库中添加数据
get(key):获取指定键的值
delete(key):删除指定键的数据
closeKVStore(storeId):通过storeId的值关闭指定的数据库。
deleteKVStore(storeId):通过storeId的值删除指定的数据库。
三、封装工具类
KvUtils.ets
import { distributedKVStore } from '@kit.ArkData';
import { bundleManager } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { KVData } from './KVData';
export default class KVUtils {
private kvManager: distributedKVStore.KVManager | undefined = undefined;
private context = getContext(this);
private kvStore: distributedKVStore.SingleKVStore | undefined = undefined;
private bundleName: string = 'com.example.demo';
constructor(encrypt: boolean, securityLevel: distributedKVStore.SecurityLevel) {
let bundleFlags = bundleManager.BundleFlag.GET_BUNDLE_INFO_DEFAULT;
bundleManager.getBundleInfoForSelf(bundleFlags, (err, data) => {
this.bundleName = data.name;
const kvManagerConfig: distributedKVStore.KVManagerConfig = {
context: this.context,
bundleName: this.bundleName
};
// 创建KVManager实例
this.kvManager = distributedKVStore.createKVManager(kvManagerConfig);
const options: distributedKVStore.Options = {
createIfMissing: true, //数据库文件不存在时是否创建数据库
backup: false, //是否备份数据库文件
autoSync: false, //是否自动同步
kvStoreType: distributedKVStore.KVStoreType.SINGLE_VERSION, //数据库类型
encrypt: encrypt, //是否加密
securityLevel: securityLevel//安全等级
};
//获取kvStore实例
this.kvManager.getKVStore<distributedKVStore.SingleKVStore>(`${securityLevel}${JSON.stringify(encrypt)}`, options,
(err, store: distributedKVStore.SingleKVStore) => {
if (err) {
//获取失败
return;
}
//获取成功
this.kvStore = store;
});
})
}
//向数据库中写入数据
async put(key: string, value: Uint8Array | string | number | boolean) {
this.kvStore!.put(key, value, (err) => {
if (err !== undefined) {
hilog.error(0x0000, 'KVUtils', `Failed to put data. Code:${err.code},message:${err.message}`);
return;
}
hilog.info(0x0000, 'KVUtils', 'Succeeded in putting data.');
});
}
//删除key对应的数据
delete(key: string) {
this.kvStore!.delete(key, (err) => {
if (err !== undefined) {
hilog.error(0x0000, 'KVUtils', `Failed to delete data. Code:${err.code},message:${err.message}`);
return;
}
hilog.info(0x0000, 'KVUtils', 'Succeeded in deleting data.');
});
}
//获取数据库所有数据
async getAll(): Promise<KVData[]> {
let allKVStore: KVData[] = [];
await this.kvStore!.getEntries('^').then((entries: distributedKVStore.Entry[]) => {
let i = 0;
for (i; i < entries.length; i++) {
let type: string = typeof entries[i].value.value;
if (type === 'object') {
type = 'Uint8Array';
}
let kvData = new KVData(entries[i].key, entries[i].value.value, type);
allKVStore.push(kvData);
}
});
hilog.info(0x0000, 'KVUtils', `kvData: ${JSON.stringify(allKVStore)}`);
return allKVStore;
}
}
//接受数据库数据实体类
export class KVData {
public key: string;
public value: Uint8Array | string | number | boolean;
public type: string;
constructor(key: string, value: Uint8Array | string | number | boolean, type: string) {
this.key = key;
this.value = value;
this.type = type;
}
}
四、使用
(1)在首页,配置数据库是否加密和安全级别
使用Navigation来实现页面的跳转。Index为首页配置页面。DbOperatePage为数据库操作页面。
import { distributedKVStore } from '@kit.ArkData'
import { DbOperatePage } from '../component/DboPeratePage';
import KVUtils from '../entryability/KVUtils';
@Entry
@Component
struct Index {
@State encrypted: boolean = false
@Provide('pageInfos') pageInfos: NavPathStack = new NavPathStack();
@State securityLevel: distributedKVStore.SecurityLevel = distributedKVStore.SecurityLevel.S1;
@StorageLink('kvUtils') kvUtils: KVUtils | undefined = undefined;
@Builder
pageMap(name: string) {
if (name === 'DbOperatePage') {
DbOperatePage()
}
}
build() {
Navigation(this.pageInfos) {
Column() {
Row() {
Text("加密")
.fontSize(14)
.fontWeight(FontWeight.Regular)
.fontColor($r('sys.color.mask_secondary'))
.lineHeight(20)
.margin({ left: 8 })
Checkbox()
.select(false)
.height(20)
.width(20)
.selectedColor('#0A59F7')
.shape(CheckBoxShape.CIRCLE)
.onChange((value: boolean) => {
this.encrypted = value;
})
}
Row() {
Text("选择安全级别:")
Select([{ value: "S1" }, { value: "S2" }, { value: "S3" }, { value: "S4" }])
.value("S1")
.onSelect((index: number, text?: string) => {
if (text === 'S1') {
this.securityLevel = distributedKVStore.SecurityLevel.S1;
} else if (text === 'S2') {
this.securityLevel = distributedKVStore.SecurityLevel.S2;
} else if (text === 'S3') {
this.securityLevel = distributedKVStore.SecurityLevel.S3;
} else if (text === 'S4') {
this.securityLevel = distributedKVStore.SecurityLevel.S4;
}
})
}.alignItems(VerticalAlign.Center)
Button("创建数据库").onClick(() => {
this.kvUtils = undefined;
this.kvUtils = new KVUtils(this.encrypted, this.securityLevel);
setTimeout(() => {
this.pageInfos.pushPath(new NavPathInfo('DbOperatePage', []));
}, 200)
}).margin({ top: 10 })
}
.height('100%')
.justifyContent(FlexAlign.Center)
.alignItems(HorizontalAlign.Center)
.width('100%')
}.navDestination(this.pageMap)
}
}
(2)数据库操作页面逻辑代码
import KVUtils from '../entryability/KVUtils'
import { KVData } from '../entryability/KVData'
@Component
export struct DbOperatePage {
@StorageLink('kvUtils') kvUtils: KVUtils | undefined = undefined;
@State data: KVData[] = []
build() {
NavDestination() {
Column() {
Button("新增数据")
.onClick(() => {
this.kvUtils?.put("key" + Date.now(), "value" + Date.now())
setTimeout(() => {
this.kvUtils?.getAll().then((data: KVData[]) => {
this.data = data
})
}, 200)
})
Column() {
ForEach(this.data, (kvData: KVData) => {
Row() {
Text(kvData.key)
.layoutWeight(1)
.fontSize(12)
Text(kvData.value.toString())
.layoutWeight(1)
.fontSize(12)
Button("删除")
.width(76)
.onClick(() => {
this.kvUtils?.delete(kvData.key)
setTimeout(() => {
this.kvUtils?.getAll().then((data: KVData[]) => {
this.data = data
})
}, 200)
})
}
.margin({
top: 8,
bottom: 12
})
.width('100%')
.height(20)
.justifyContent(FlexAlign.SpaceBetween)
}, (kvData: KVData) => JSON.stringify(kvData))
}
}.width("100%")
.height("100%")
}
.width('100%')
.height('100%')
.title("数据库操作")
.backgroundColor('#F1F3F5')
}
}