#我的鸿蒙开发手记#通过键值型数据库实现数据持久化 原创

鸿蒙小白001
发布于 2025-5-8 19:34
浏览
0收藏

一、使用场景

当我们需要对数据进行持久化处理时,如果数据没有复杂的关系模型,推荐使用键值型数据库对数据做持久化处理。


二、键值型数据库常用方法

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')


  }
}

#我的鸿蒙开发手记#通过键值型数据库实现数据持久化-鸿蒙开发者社区


©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
标签
已于2025-5-9 16:12:24修改
收藏
回复
举报
回复
    相关推荐