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

在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}`);

    }

  }

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容