HarmonyOS 鸿蒙Next 用户首选项实现数据持久化 相关问题

发布于 1周前 作者 songsunli 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 用户首选项实现数据持久化 相关问题

我用deletePreferences 删除缓存及本地数据 为什么无法清除对应的持久化文件

2 回复

preferences.deletePreferences:  从缓存中移出指定的Preferences实例,若Preferences实例有对应的持久化文件,则同时删除其持久化文件。使用callback异步回调。参考链接: https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-data-preferences-V5#preferencesdeletepreferences

参考demo:

import { promptAction } from '@kit.ArkUI';
import { preferences } from '@kit.ArkData';

let context = getContext(this);
let preference: preferences.Preferences;
let preferenceTemp: preferences.Preferences;

// 对象类

export class ImageModel {
  constructor(id: string, tokenInfo: string, imgInfo: string, urlInfo: string) {
    this.id = id
    this.token = tokenInfo
    this.img = imgInfo
    this.url = urlInfo
  }
  id?: string = '';
  token: string = '';
  img: string = '';
  url: string = ''
}

// 首选项工具类
class PreferenceModel {
  // 初始化
  async getPreferencesFromStorage() {
    try {
      preference = await preferences.getPreferences(context, 'ImageUrlData.db');
    } catch (err) {
      console.error('[PreferenceModel]', `Failed to get preferences, Cause: ${err}`);
    }
  }
  // 删除首选项
  async deletePreferences() {
    try {
      await preferences.deletePreferences(context, 'ImageUrlData.db');
    } catch (err) {
      console.error('[PreferenceModel]', `Failed to delete preferences, Cause: ${err}`);
    };
    preference = preferenceTemp;
    this.showToastMessage('删除数据库成功');
  }
  // 插入值
  async putPreference(Image: string, ImageInfo: ImageModel) {
    if (!preference) {
      await this.getPreferencesFromStorage();
    }
    try {
      await preference.put(Image, JSON.stringify(ImageInfo));
    } catch (err) {
      console.error('[PreferenceModel]', `Failed to put value, Cause: ${err}`);
    }
    await preference.flush();
  }
  // 获取值
  async getPreference(Image: string) {
    let ImageInfo = '';
    if (!preference) {
      await this.getPreferencesFromStorage();
    }
    try {
      ImageInfo = (await preference.get(Image, '')).toString();
    } catch (err) {
      console.error('[PreferenceModel]', `Failed to get value, Cause: ${err}`);
    }
    if (ImageInfo === '') {
      this.showToastMessage('数据为空,请先写入数据');
      return;
    }
    this.showToastMessage('写入数据成功');
    return JSON.parse(ImageInfo);
  }
  async getImageData(Image: string) {
    return await this.getPreference(Image);
  }
  // 写入数据
  writeData(Image: string, ImageInfo: ImageModel) {
    this.putPreference(Image, ImageInfo);
    this.showToastMessage('写入数据成功');
  }
  showToastMessage(message: string) {
    promptAction.showToast({
      message: message,
      duration: 3000
    });
  };
  
/**
  * 操作首选项
  */
export class LocalDataManager {
  preferenceModel = new PreferenceModel()
  private static localDataManager: LocalDataManager;
  
  private constructor() {
    this.preferenceModel.getPreferencesFromStorage()
  }
  static instance() {
    if (!LocalDataManager.localDataManager) {
      LocalDataManager.localDataManager = new LocalDataManager();
    }
    return LocalDataManager.localDataManager;
  }
  async queryImageInfo(Image: string) {
    return await this.preferenceModel.getImageData(Image)
  }
  insertImageInfo(Image: string, ImageInfo: ImageModel) {
    this.preferenceModel.writeData(Image, ImageInfo)
    return Image.length
  }
  updateImageInfo(Image: string, ImageInfo: ImageModel) {
    this.preferenceModel.writeData(Image, ImageInfo)
    return Image.length
  }
  deleteImageInfo() {
    this.preferenceModel.deletePreferences()
  }
}

// 使用首选项做缓存

@Entry
@Component
struct NeiMengGuNongJi {
  private localDataManager: LocalDataManager = LocalDataManager.instance();
  @State token_Info: string = ''
  private img: string = 'image00'
  private url: string = 'url000'
  @State num: number = 0
  @State keyInfo: string = ''
  @State imageData: ImageModel = new ImageModel('', '', '', '')

  build() {
    Column() {
      Button('点击存入数据库')
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .onClick(() => {
          for (let i = 1; i <= 10; i++) {
            let tokenInfo = "token00" + i
            let image = this.img + i
            let urlInfo = this.url + i
            let ImageInfo = new ImageModel("", tokenInfo, image, urlInfo);
            this.localDataManager.insertImageInfo(image, ImageInfo)
          }
        })

      Button('删除首选项').width(100).height(100)
        .onClick(() => {
          this.localDataManager.deleteImageInfo()
        })

      TextInput({ placeholder: '输入key值:例如image001' })
        .type(InputType.Normal)
        .onChange((key: string) => {
          this.keyInfo = key
        })

      Button('通过key值:' + this.keyInfo + ", 获取value值")
        .fontSize(18)
        .fontWeight(FontWeight.Bold)
        .onClick(async () => {
          if (this.keyInfo !== '') {
            this.imageData = await this.localDataManager.queryImageInfo(this.keyInfo) as ImageModel
            console.info("imageData=" + JSON.stringify(this.imageData))
          }
        })
      Text("key: " + this.keyInfo + ", value: " + (this.imageData.token === '' ? '' : JSON.stringify(this.imageData)))
        .fontSize(40)
    }
    .width('100%')
  }
}

请确认deletePreferences的时候和getPreferences的context是否相同。

context不同,preferences对象就不是一个对象

更多关于HarmonyOS 鸿蒙Next 用户首选项实现数据持久化 相关问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next系统中,用户首选项的数据持久化通常通过特定的系统API或框架组件来实现,而非依赖传统编程语言(如Java或C语言)的内置功能。以下是实现数据持久化的基本步骤:

  1. 使用数据存储API:HarmonyOS提供了多种数据存储方式,如关系型数据库(SQLite)、轻量级数据存储(KeyValue Store)等。对于用户首选项,KeyValue Store可能是一个合适的选择,因为它简化了键值对的存储和检索过程。

  2. 数据写入:通过KeyValue Store的API,将用户首选项的数据以键值对的形式写入存储中。确保在写入过程中处理任何可能的异常或错误。

  3. 数据读取:在用户需要访问首选项时,通过相应的API从KeyValue Store中读取键值对。同样,需要处理读取过程中可能发生的异常。

  4. 数据更新与删除:提供机制以允许用户更新或删除首选项数据。这通常涉及修改现有的键值对或删除不再需要的键值对。

  5. 数据安全性:考虑数据的敏感性和安全性,确保在存储和读取过程中采取适当的保护措施。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html。该地址提供了专业的技术支持和解决方案,可以帮助你解决HarmonyOS鸿蒙Next用户首选项数据持久化的相关问题。

回到顶部