【鸿蒙开发】本地数据持久化

在ArkData(方舟数据管理)中,根据数据特点,数据持久化存储的方式有以下三种:

1、用户首选项(Preferences):

对于Key和Value有一些限制:

Key为string类型,非空且长度<=80个字节;

Value为string时,长度<=8192个字节;

建议存储的数据不超过1万条;

类似iOS的UserDefaults或者Android的SharedPreference,提供了轻量级配置数据的持久能力;

支持订阅数据变化的通知能力;

不支持分布式同步,常用于保存应用配置信息、用户偏好设置等;

会将文本中的数据全量加载到内存中,访问快,效率高,但不适合存储大量数据

接口说明

用户首选项和iOS的UserDefault,Android的SharedPreference的使用方法很像,都有基本的增、删、改、查方法,但不同的是用户首选项提供了订阅数据变更的能力:

// 获取Preferences实例。该接口存在异步接口。

getPreferencesSync(context: Context, options: Options): Preferences

// 将数据写入Preferences实例,可通过flush将Preferences实例持久化。该接口存在异步接口。

putSync(key: string, value: ValueType): void

// 检查Preferences实例是否包含名为给定Key的存储键值对。给定的Key值不能为空。该接口存在异步接口。

hasSync(key: string): void

// 获取键对应的值,如果值为null或者非默认值类型,返回默认数据defValue。该接口存在异步接口。

getSync(key: string, defValue: ValueType): void

// 从Preferences实例中删除名为给定Key的存储键值对。该接口存在异步接口。

deleteSync(key: string): void

// 将当前Preferences实例的数据异步存储到用户首选项持久化文件中。

flush(callback: AsyncCallback<void>): void

// 订阅数据变更,订阅的数据发生变更后,在执行flush方法后,触发callback回调。

on(type: 'change', callback: Callback<string>): void

// 取消订阅数据变更。

off(type: 'change', callback?: Callback<string>): void

// 从内存中移除指定的Preferences实例。若Preferences实例有对应的持久化文件,则同时删除其持久化文件。

deletePreferences(context: Context, options: Options, callback: AsyncCallback<void>): void

举例说明

// 导入包

import dataPreferences from '@ohos.data.preferences';

// 获取context

let context = getContext(this);

export default class PreferencesManager {

  static shared = new PreferencesManager();

  preferences?: dataPreferences.Preferences;

  preferencesName: string = 'CommonPreferences';


  // 初始化preferences实例

  initPreferences() {

    this.preferences = dataPreferences.getPreferencesSync(context, { name: this.preferencesName });

  }


  // 设置数据

  set(key: string, value: dataPreferences.ValueType) {

    if (!this.preferences) {

      this.initPreferences();

    }

    this.preferences?.putSync(key, value);

    this.preferences?.flush();

  }

  // 获取数据

  get(key: string): dataPreferences.ValueType | null | undefined {

    if (!this.preferences) {

      this.initPreferences();

    }

    let value = this.preferences?.getSync(key, null);;

    return value;

  }

  // 删除数据

  delete(key: string) {

    if (!this.preferences) {

      this.initPreferences();

    }

    if (this.preferences?.hasSync(key)) {

      this.preferences.deleteSync(key);

      this.preferences.flush();

    }

  }

}

2.键值型数据库

键值型数据库用于存储键值对形式的数据,适用于简单的存储场景:比如存储商品名称及对应价格、员工工号及今日是否已出勤等。

针对于单版本数据库,针对每条记录,Key的长度<=1KB,Value的长度<4MB;

设备协同数据库,针对每条记录,Key的长度<=896 Byte, Value的长度<4MB;

每个应用程序最多支持同时打开16个键值型分布式数据库;

键值型数据库事件回调方法中不允许进行阻塞操作,例如修改UI组件;

接口说明

键值型数据库相关的接口,大部分为异步接口,均有callback和Promise两种返回形式。

// 创建一个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<Uint8Array|string|boolean|number>): void

// 从数据库中删除指定键值的数据

delete(key: string, callback: AsyncCallback<void>): void

 举例说明

// 导入模块

import distributedKVStore from '@ohos.data.distributedKVStore';

// 获取context

let context = getContext(this);

export default class KVStoreManager {


  // 单例模式

  static shared = new KVStoreManager();


  // SingleKVStore实例

  KVStore?: distributedKVStore.SingleKVStore;

  // 创建并获取KVStore

  async initKVStore() {

    try {

      // Create KVManager

      let bundleName = await getBundleName();

      const kvManagerConfig: distributedKVStore.KVManagerConfig = {

        context: context,

        bundleName: bundleName

      };

      const manager = distributedKVStore.createKVManager(kvManagerConfig);

      // Create KVStore

      const options: distributedKVStore.Options = {

        createIfMissing: true,

        encrypt: false,

        backup: false,

        autoSync: false,

        kvStoreType: distributedKVStore.KVStoreType.SINGLE_VERSION,

        securityLevel: distributedKVStore.SecurityLevel.S1

      };

      this.KVStore = await manager.getKVStore<distributedKVStore.SingleKVStore>('storeId', options);

    } catch (error) {

      console.log('[KVStoreManager]', `Failed to initKVStore, Cause: ${error}`);

    }

  }


  // 插入数据

  async set(key: string, value: Uint8Array | string | number | boolean) {

    if (!this.KVStore) {

      await this.initKVStore();

    }

    try {

      await this.KVStore?.put(key, value);

    } catch (error) {

      console.log('[KVStoreManager]', `Failed to set value, Cause: ${error}`);

    }

  }

  // 获取数据

  async get(key: string): Promise<string | number | boolean | Uint8Array | null | undefined> {

    if (!this.KVStore) {

      await this.initKVStore();

    }

    let value: Uint8Array | string | number | boolean | null | undefined = null;

    try {

      return this.KVStore?.get(key);

    } catch (error) {

      console.log('[KVStoreManager]', `Failed to get value, Cause: ${error}`);

    }

    return value;

  }


  // 删除数据

  async delete(key: string) {

    if (!this.KVStore) {

      await this.initKVStore();

    }

    try {

      await this.KVStore?.delete(key);

    } catch (error) {

      console.log('[KVStoreManager]', `Failed to delete value, Cause: ${error}`);

    }

  }

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容