Skip to content

数据持久化

INFO

用户首选项为应用提供 Key-Value 键值型的数据处理能力,支持应用持久化轻量级数据

结构如图

  • 特别注意

INFO

首选项不能跨 Ability,除非 Context 是共用的

流程

图片

代码

(1) 创建首选项工具类

js
import { preferences } from "@kit.ArkData"
import { Context } from '@ohos.arkui.UIContext'

class PerferencesUtil {
  preMap: Map<string, preferences.Preferences> = new Map()

  // 加载
  async loadPreference(context: Context, name: string) {
    try {
      // 加载preferences
      console.log("执行了吗")
      let pref = await preferences.getPreferences(context, name)
      this.preMap.set(name, pref)
      console.log('testTag', `加载Preferences[${name}]成功`)
    } catch (e) {
      console.log('testTag', `加载Preferences[${name}]失败`, JSON.stringify(e))
    }
  }

  // 获取
  async getPreferenceValue(name: string, key: string, defaultValue: preferences.ValueType) {
    if (!this.preMap.has(name)) {
      console.log('testTag', `Preferences[${name}]尚未初始化!`)
      return
    }
    try {
      let pref = this.preMap.get(name)
      // 读数据
      let value = await pref?.get(key, defaultValue)
      console.log('testTag', `读取Preferences[${name}.${key}=${value}]成功`)
      return value
    } catch (e) {
      console.log('testTag', `读取Preferences[${name}.${key}]失败`, JSON.stringify(e))
      return
    }
  }

  // 增加
  async putPreferenceValue(name: string, key: string, value: preferences.ValueType) {
    if (!this.preMap.has(name)) {
      console.log('testTag', `Preferences[${name}]尚未初始化!`)
      return
    }
    try {
      let pref = this.preMap.get(name)
      // 写入数据
      await pref?.put(key, value)
      // 刷盘
      await pref?.flush()
      console.log('testTag', `保存Preferences[${name}.${key}=${value}]成功`)
    } catch (e) {
      console.log('testTag', `保存Preferences[${name}.${key}=${value}]失败`, JSON.stringify(e))
    }
  }

  // 删除
  async delPreferenceValue(name: string, key: string,) {
    if (!this.preMap.has(name)) {
      console.log('testTag', `Preferences[${name}]尚未初始化!`)
      return
    }
    try {
      let pref = this.preMap.get(name)
      // 删除数据
      await pref?.delete(key)
      // 刷盘
      await pref?.flush()
      console.log('testTag', `删除Preferences[${name}.${key}]成功`)
    } catch (e) {
      console.log('testTag', `删除Preferences[${name}.${key}]失败`, JSON.stringify(e))
    }
  }

  // 删除全部
  delPreferenceAll() {
    if (this.preMap.size == 0) {
      console.log('testTag', `Preferences尚未初始化!`)
      return
    }
    try {
      // 清空 map
      console.log('testTag', `开始删除Preferences`)
      this.preMap.forEach((value: preferences.Preferences, key: string) => {
        value.clear()
        value.flush()
      })
      console.log(this.preMap.size.toString())
      console.log('testTag', `删除全部首选项`)

    } catch (e) {
      console.log('testTag', `删除Preferences失败`, JSON.stringify(e))
    }
  }
}

const preferencesUtil = new PerferencesUtil()

export default preferencesUtil as PerferencesUtil

(2) 在生命周期函数中调用

  • 必须在模拟器中运行,本地预览不管用

  • 函数是在 Ability 里面的文件

js
// 导入
import PerferencesUtil from "../utils/PreferencesUtils";

// 调用
async onCreate(want: Want, launchParam: AbilityConstant.LaunchParam) {
    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
    // 加载
    await PerferencesUtil.loadPreference(this.context,"FirstOne");
    await PerferencesUtil.loadPreference(this.context,"FirstTwo");
  }

(3) 组件里面调用

js
import PreferencesUtils from "../utils/PreferencesUtils"
import { router } from "@kit.ArkUI"


@Entry
@Component
struct Index {
  @State message: string = 'Hello World';
  @State age: number = 26;

  aboutToAppear(): void {
    this.loaddata()
  }

  // 加载数据

  async loaddata() {
    await this.getdata()
  }

  // 获取数据

  async getdata() {
    this.message = await PreferencesUtils.getPreferenceValue("FirstOne", "username", "没有名字") as string
    this.age = await PreferencesUtils.getPreferenceValue("FirstTwo", "age", 13) as number
  }

  // 增加
  async putdata() {
    await PreferencesUtils.putPreferenceValue("FirstOne", "username", "大刀王五")
    await PreferencesUtils.putPreferenceValue("FirstTwo", "age", 65)
  }

  // 删除方法

  async deldata() {
    await PreferencesUtils.delPreferenceValue("FirstOne", "username")
  }

  // 删除全部

  async delall() {
    await PreferencesUtils.delPreferenceAll()
  }

  build() {
    Column() {
      Column({ space: 30 }) {
        Text() {
          Span(this.message)
        }.fontSize(48).fontColor(Color.Blue)

        Text() {
          Span(this.age.toString())
        }.fontSize(48).fontColor(Color.Blue)

        Button("跳转到第二页").type(ButtonType.Capsule).onClick(() => {
          router.pushUrl({
            url: "pages/Second"
          })
        })
        Button("点击了增加首选项").type(ButtonType.Capsule).onClick(() => {
          this.putdata()
        })
        Button("删除全部首选项").type(ButtonType.Capsule).onClick(() => {
          this.delall()
        })
      }
    }.width('100%').height("100%").backgroundColor(Color.Red)
  }
}