HarmonyOS鸿蒙Next中array数组在软件中修改后,重启软件就变回原数组了

HarmonyOS鸿蒙Next中array数组在软件中修改后,重启软件就变回原数组了

array数组用过textinput组件进行了push添加,怎么让他永久修改在本地,而不会因为重启软件,变回原数组。

10 回复

【完整示例】

src/main/ets/entryability/EntryAbility.ets
import {UIAbility} from '@ohos.app.ability.UIAbility';
import {window} from '@ohos.window';
import {MyPreferencesUtil} from '../MyPreferencesUtil';

export default class EntryAbility extends UIAbility {
  onCreate(want, launchParam) { 
    MyPreferencesUtil.getData(this.context)
  } 

  onWindowStageCreate(windowStage: window.WindowStage) { 
    windowStage.loadContent('pages/Index', (err, data) => { 
    });
  }
 
}
src/main/ets/MyPreferencesUtil.ets
import dataPreferences from '@ohos.data.preferences';
import bundleManager from '@ohos.bundle.bundleManager';

/**
 * 本地首选项数据的保存,利用key value
 * 【使用要求】
 * DevEco Studio 3.1.1 Release
 * api 9
 * 【使用示例】
 * 1、app启动时,从本地读取数据,并写到内存中去
 * 注意:修改EntryAbility.ts的扩展名,改成ets,即:EntryAbility.ets
 * import MyPreferencesUtil from '../common/utils/MyPreferencesUtil'
 * export default class EntryAbility extends UIAbility {
 *      onCreate(want, launchParam) {
 *            MyPreferencesUtil.getData(this.context)
 *      }
 * }
 * 2、在修改内存数据时,再调用一下保存方法
 * 注意:开发工具DevEco studio中,默认每次启动app是先卸载再安装导致本地保存的数据丢失,需要改下配置每次运行都覆盖安装【entry-->edit config... --> keep application data】
 * import {MyPreferencesUtil,UserInfo} from '../common/utils/MyPreferencesUtil'
 * Button('测试').onClick(()=> {
 *     console.info('====当前内存信息 1 ',JSON.stringify(MyPreferencesUtil.getInstance()))
 *     MyPreferencesUtil.getInstance().mUserInfo.token = "测试测试"
 *     MyPreferencesUtil.saveData()
 *     console.info('====当前内存信息 2 ',JSON.stringify(MyPreferencesUtil.getInstance()))
 * })
 * 【参考地址】
 * https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/js-apis-data-preferences-0000001427745052-V3#ZH-CN_TOPIC_0000001573928817__preferences
 * https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/js-apis-bundlemanager-0000001427585060-V3#ZH-CN_TOPIC_0000001573928977__bundlemanagergetbundleinfoforself
 */

export class MyPreferencesUtil {
  //日志过滤器
  private static readonly LOG: string = "====MyPreferencesUtil"
  //本地保存的文件名,和文件内的key名这里打算共用一个就行
  private static readonly FILENAME_AND_KEY: string = 'FILENAME_AND_KEY'

  /** 本地要保存的用户信息 */
  public mUserInfo: UserInfo = new UserInfo()
  // 本地要保存的环境信息
  public mEnvirInfo: EnvirInfo = new EnvirInfo()
  //=========单例模式,保存数据到内存实例 start=========
  private static instance: MyPreferencesUtil;

  private constructor() {
  }
  /**
   * 通过单例,获取本地映射到内存中的实例
   * @returns 内存中本地数据的实例
   */
  public static getInstance() {
    if (this.instance == null) {
      this.instance = new MyPreferencesUtil();
    }
    return this.instance;
  }
  //=========单例模式,保存数据到内存实例 end=========

  /**
   * 从磁盘本地读取数据到内存,赋值给instance
   * @param context 在pages中使用getContext(this),在EntryAbility中,使用this.context
   */
  public static async getData(context: Context) {
    try {
      console.info(MyPreferencesUtil.LOG, 'getData');
      let file = await dataPreferences.getPreferences(context, MyPreferencesUtil.FILENAME_AND_KEY)
      console.info(MyPreferencesUtil.LOG, 'getData', 'file succ');
      let value = await file.get(MyPreferencesUtil.FILENAME_AND_KEY, JSON.stringify(MyPreferencesUtil.getInstance()))
      console.info(MyPreferencesUtil.LOG, 'getData', 'get succ', 'value:' + value);
      Object.assign(MyPreferencesUtil.getInstance(), JSON.parse(value.toString())) //将本地数据 拷贝到单例中去。
      console.info(MyPreferencesUtil.LOG, 'getData', 'assign succ');
      let bundleFlags = bundleManager.BundleFlag.GET_BUNDLE_INFO_DEFAULT;
      let data = await bundleManager.getBundleInfoForSelf(bundleFlags); //开始保存app的版本名称和版本号
      MyPreferencesUtil.getInstance().mEnvirInfo.versionName = data.versionName
      MyPreferencesUtil.getInstance().mEnvirInfo.versionCode = data.versionCode
      console.info(MyPreferencesUtil.LOG, 'getData', 'set versionName and versionCode succ');
    } catch (e) {
      console.error(MyPreferencesUtil.LOG, 'getData', JSON.stringify(e));
    }
  }

  /**
   * 数据备份至磁盘本地
   */
  public static async saveData() {
    try {
      console.info(MyPreferencesUtil.LOG, 'saveData');
      let file = await dataPreferences.getPreferences(getContext(this), MyPreferencesUtil.FILENAME_AND_KEY)
      console.info(MyPreferencesUtil.LOG, 'saveData', 'file succ');
      await file.put(MyPreferencesUtil.FILENAME_AND_KEY, JSON.stringify(MyPreferencesUtil.getInstance()))
      console.info(MyPreferencesUtil.LOG, 'saveData', 'put succ');
      await file.flush()
      console.info(MyPreferencesUtil.LOG, 'saveData', 'flush succ');
    } catch (e) {
      console.error(MyPreferencesUtil.LOG, 'saveData', JSON.stringify(e));
    }
  }
}

/**
 * 用户信息
 */
export class UserInfo {
  /**
   * 用户登录成功后要保存的token
   */
  public token: string = ""
  /**一个数组*/
  public array: string[] = []
}

/**
 * 环境信息
 */
export class EnvirInfo {
  /**
   * 首次启动的弹窗是否点击过“同意”。true:已同意,false:没同意
   */
  public isAgreement: boolean = false
  /**
   * 当前app的版本名称
   */
  public versionName: string = ''
  /**
   * 当前app的版本号
   */
  public versionCode: number = 0
}
src/main/ets/pages/Index.ets
import { MyPreferencesUtil } from '../MyPreferencesUtil'

@Entry
@Component
struct Index {
  build() {
    Column () {
      Button('保存数组').onClick(() => {
        let array:string[] = MyPreferencesUtil.getInstance().mUserInfo.array
        array.push('张三')
        array.push('李四')
        //当前内存中的数据在 MyPreferencesUtil.getInstance().mUserInfo.array
        MyPreferencesUtil.saveData() //将内存中的数据写入本地磁盘,下次启动app时记得从 src/main/ets/entryability/EntryAbility.ets 中调用 MyPreferencesUtil.getData(this.context) 把本地磁盘数据加载到内存中
      })
      Button('打印数组').onClick(() => {
        //打印内存中的数组数据
        let array : string [] = MyPreferencesUtil.getInstance().mUserInfo.array
        console.info('array', JSON.stringify(array))
      })
    }
    .width('100%')
    .height('100%')
  }
}

最后记得勾选覆盖安装选项

更多关于HarmonyOS鸿蒙Next中array数组在软件中修改后,重启软件就变回原数组了的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


下课了去试试🫡

太感谢了!!成功了!!!

数据持久化

好的,谢谢,

基本信息
姓名:张三
职位:软件工程师
技能:Python, Java, C++

工作经验
公司A
职位:初级软件工程师
时间:2018-2020

公司B
职位:高级软件工程师
时间:2020-至今

利用首选项@ohos.data.preferences 把数据写入本地磁盘,等app重启软件的时候再读取磁盘数据。

参考:https://developer.huawei.com/consumer/cn/blog/topic/03146416496480017

对不起,您的内容似乎缺少HTML代码。请提供包含要转换的HTML内容的完整信息,以便我可以帮助您将其转换为Markdown格式。

用这个方法是不是得舍弃array,首选项@ohos.data.preferences看了好几个教学没这么看懂🫠,

Button(‘保存数组’).onClick(() => { let array:string[] = MyPreferencesUtil.getInstance().mUserInfo.array array.push(‘张三’) array.push(‘李四’) //当前内存中的数据在 MyPreferencesUtil.getInstance().mUserInfo.array MyPreferencesUtil.saveData() //将内存中的数据写入本地磁盘,下次启动app时记得从 src/main/ets/entryability/EntryAbility.ets 中调用 MyPreferencesUtil.getData(this.context) 把本地磁盘数据加载到内存中 })

Button(‘打印数组’).onClick(() => { //打印内存中的数组数据 let array : string [] = MyPreferencesUtil.getInstance().mUserInfo.array console.info(‘array’, JSON.stringify(array) ) })

在HarmonyOS鸿蒙Next中,如果修改后的数组在软件重启后恢复为原数组,可能是因为数组数据未持久化存储。建议将修改后的数组数据保存到本地存储(如Preferences或数据库)中,并在软件启动时从存储中读取数据。这样可以确保数据在重启后保持不变。

回到顶部