1.preference:用户首选项

这种持久化是轻量级数据的持化,采用键值的方式进行存储

因为这种储存的复用性极高,故我这边选择封装为一个工具类来进行复用

1.2首先创建实例,用来接收后面初始化传入的实例对象

1.3初始化获取应用上下文信息以及传入设定的表名

初始化后我们就得到了一个实例对象,后面的一些添加删除等方法均在该实例上

1.4 flush写入硬盘进行持久化

这时候直接调用添加的数据也有,但是还没有写入硬盘,这时候需要通过flush方法刷新到硬盘中

因同样也需重复调用,故也可以封装为方法

1.5 封装查询数据的方法

使用getSync来查询,如果查询不到值则会把第二个值作为默认值赋予

1.6 修改数据方法封装

同样也是调用getPreferencesSync来进行数据的添加

这个方法是有值则覆盖,没值就是新增

1.7 删除同样也可以封装为一个方法

调用实例里的delete方法接收删除的元素标识,然后给予一些适当的提示

以上是一些常用的用户首选项的方法,通过这些方法能把数据持续化保存

具体其他方法可看官网

// 持久化数据
export class PreferencesUtil {
  // 获取Preferences实例 储存初始化得到的用户首选项的实例
  private dataPreferences: preferences.Preferences | null = null;

  /**
   * 初始化preferences对象
   * @param context
   */
  init(context: Context, storeName: string) {
    // Preferences实例的名称 你要实例那个首选项 类型是preferences.Options
    let options: preferences.Options = { name: storeName };
    // 获取实例存储对象
    this.dataPreferences = preferences.getPreferencesSync(context, options);
    // 首次进入时,恭喜初始化成功
    loggerUtils.info('初始持久化工具成功')

    // 当Key值变化时,触发回调,重新刷新数据到硬盘
    // 监听不到 这个on确定能放工具类里面吗
    // on的监听貌似得先flush保存其内之后才能监听
    this.dataPreferences.on('change', (key: string) => {
      loggerUtils.info(`The key  ${key}  changed`);
    })
  }

  flushData() {
    (this.dataPreferences as preferences.Preferences).flush((error: BusinessError) => {
      if (error) {
        loggerUtils.error(`Failed to flush. Code: ${error.code},message: ${error.message}`)
        return
      }
      loggerUtils.info(`Succeeded in flushing`)
    })
  }

  // 添加数据
  insert(key: string, value: string) {
    if (this.dataPreferences) {
      // 检查缓存的Preferences实例中是否包含指定Key的存储键值对,此为同步接口
      if (this.dataPreferences.hasSync(key)) {
        loggerUtils.info(`已经存在key:${key}`)
        promptAction.showToast({
          message: '已存在同名key',
          duration: 5000
        })
      } else {
        this.dataPreferences.putSync(key, value)
        promptAction.showToast({
          message: '添加成功',
          duration: 5000
        })
        preferencesUtil.flushData()
      }
    }
    // preferencesUtil.flushData()
    // this.dataPreferences?.flush().then(() => {
    //   console.info("Succeeded in flushing.");
    // }).catch((err: BusinessError) => {
    //   console.error("Failed to flush. code =" + err.code + ", message =" + err.message);
    // })
  }

  // 查询数据 不一定能取到值
  readData(key: string, value?: string) {
    // 外层的都是if判断都是防止数据为空 不判断也可用断言as的方式来防止为空
    try {
      // getSync从缓存的Preferences实例中获取键对应的值,如果值为null或者非默认值类型,返回默认数据defValue
      // 有值获取值 没有值获取默认疏浚
      let info = this.dataPreferences?.getSync(key, value ? value : "default")
      loggerUtils.info(`已查到数据,The '${key}' value is + '${info}'`)
      promptAction.showToast({
        message: '已查询到持久化数据',
        duration: 5000
      })
      return info
    } catch (err) {
      return '查询错误'
    }
  }

  // 查询全部数据
  readAllData() {
    return new Promise((resolve: (value: string | number | boolean | Uint8Array) => void,
      reject: (value?: string) => void) => {
      this.dataPreferences?.getAll((err: BusinessError, value: Object) => {
        // 错误一般为具体的错误对象 err为undefined时,程序正确执行没有错误
        if (err) {
          // 失败把具体错误对象数字名打印出来
          loggerUtils.error("Failed to get all key-values. code = " + err.code, "message = " + err.message)
          reject('查询所有数据失败')
          return
        }
        let allKeys = Object.keys(value)
        loggerUtils.info("getAll keys = ", JSON.stringify(allKeys))
        // 不能返回对象回去,通过拼接返回string类型,通过split分割拿到新的数组
        resolve(allKeys.join('-'))
      })
    })
  }

  // 修改数据
  update(key: string, value: string) {
    if (this.dataPreferences?.hasSync(key)) {
      loggerUtils.info('已查询到该键,正在为您修改')
      preferencesUtil.insert(key, value)
      preferencesUtil.flushData()
      // preferencesUtil.flushData()
    } else {
      loggerUtils.info('未查询到该键,无法修改')
    }
  }

  delete(key: string) {
    if (this.dataPreferences) {
      this.dataPreferences.delete(key, (err: BusinessError, data) => {
        if (err) {
          console.error("Failed to delete the key 'startup'. code =" + err.code + ", message =" + err.message);
          return;
        }
        console.info("Succeeded in deleting the key 'startup'.");
        promptAction.showToast({
          message: '已删除',
          duration: 5000
        })
        preferencesUtil.flushData()
      })
    }
  }

  clearAllData() {

  }
}


export let preferencesUtil = new PreferencesUtil()

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐