HarmonyOS鸿蒙Next数据管理,如何将登录数据缓存到本地

HarmonyOS鸿蒙Next数据管理,如何将登录数据缓存到本地 我想登录成功后将token、账号、密码缓存到本地,供下次重新打开APP的时候判断使用,如果本地缓存有token,就直接跳转首页,而不用每次打开APP都要重新登录。

我已从之前的咨询中掌握了:

AppStorage.setOrCreate(userInfo, userInfoValue)
AppStorage.get(userInfo)

但是我发现AppStorage在重启APP后缓存的token会变成undefined

所以我该如何正确将数据缓存到本地

6 回复

更多关于HarmonyOS鸿蒙Next数据管理,如何将登录数据缓存到本地的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


AppStorage是运行时的内存,但是在应用退出再次启动后,还想拿到保存选定的结果,需要用到PersistentStorage。文档如下:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/arkts-persiststorage-0000001774119950-V5

同时还通过用户首选项实现数据持久化,文档如下:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/data-persistence-by-preferences-V5

import router from '@ohos.router'
PersistentStorage.persistProp('token', '')
@Entry
@Component
struct Index {
  @State message: string = '这是登录页';
  private title: string = "手机号登录"
  private backColor: ResourceColor = "#DC143C"
  @StorageLink('token') token: string = ''

  onPageShow() {
     if (this.token.length > 0 && this.token !== "undefined"){
      console.log('登录页 onPageShow token有值 说明之前 有登录过 直接跳转到首页' + this.token)
      this.goToHome()
    } else {
      console.log('登录页 onPageShow token没值 说明之前 没登录过')
    }
  }

  build() {
    Stack(){
      Text(this.message + this.token)
        .fontSize(50)
        .fontWeight(FontWeight.Bold)
        .margin({
          top:200
        })

      Button()
        .type(ButtonType.Capsule)
        .width('100%')
        .height('50')
        .backgroundColor(this.backColor)
        .border({
          color:'#CCCCCC',
          width:1
        })
        .margin({
          top:500
        })

      Row(){

        Text(this.title)
          .fontSize(18)
          .fontColor('#333333')

        Text('(上次登录)')
          .fontSize(14)
          .fontColor('#C0C0C0')

      }
      .width('100%')
      .height('100%')
      .justifyContent(FlexAlign.Center)
      .onClick(() =>{
        this.mobilePhoneLoginClick()
      })
      .margin({
        top:500
      })
    }
    .width('90%')
    .height('50')
  }

  mobilePhoneLoginClick(){
    console.info('手机号登录 点击')
    this.loginSuccess()
  }

  loginSuccess(){
    let token = 'abc123456'
    console.info('登录成功 存本地的 token:' + token)
    AppStorage.setOrCreate('token',token)
    this.goToHome()
  }

  goToHome(){
    console.info('跳转到 首页')
    router.pushUrl({ url: 'pages/Home' })
  }
}

// 下面是Home.ets页面
@Entry
@Component
struct Home {
  @State message: string = '这是首页';
  @State token: string = ''

  onPageShow() {
    this.token = AppStorage.get('token') + ''
    console.info('首页 取存在本地的 temp:' + this.token)
  }
  build() {
    Row() {
      Column() {
        Text(this.message + this.token)
          .fontSize(50)
          .fontWeight(FontWeight.Bold)
      }
      .width('100%')
    }
    .height('100%')
  }
}

因为数据没有持久化,把数据持久化一下,或者用首选项储存一下

可以用三方库mmkv进行持久化存储,比用户首选项啥的都好用,openharmony三方库网站:https://ohpm.openharmony.cn/#/cn/detail/@ohos%2Fmmkv

在HarmonyOS中,可以使用Preferences来实现登录数据的本地缓存。Preferences是一种轻量级的键值对存储方式,适合存储简单的配置数据或用户登录信息。

  1. 初始化Preferences:

    首先,需要获取Preferences实例。可以通过DataAbilityHelperContext来获取。

    import preferences from '[@ohos](/user/ohos).data.preferences';
    
    let preferencesInstance = null;
    preferences.getPreferences(this.context, 'myLoginData').then((pref) => {
        preferencesInstance = pref;
    }).catch((err) => {
        console.error("Failed to get preferences.", err);
    });
    
  2. 存储登录数据:

    使用put方法将登录数据存储到Preferences中。

    preferencesInstance.put('username', 'user123').then(() => {
        return preferencesInstance.put('password', 'pass123');
    }).then(() => {
        return preferencesInstance.flush();
    }).catch((err) => {
        console.error("Failed to save login data.", err);
    });
    
  3. 读取登录数据:

    使用get方法从Preferences中读取登录数据。

    preferencesInstance.get('username', 'defaultUsername').then((value) => {
        console.log("Username: " + value);
    }).catch((err) => {
        console.error("Failed to read username.", err);
    });
    
    preferencesInstance.get('password', 'defaultPassword').then((value) => {
        console.log("Password: " + value);
    }).catch((err) => {
        console.error("Failed to read password.", err);
    });
    
  4. 删除登录数据:

    使用delete方法从Preferences中删除登录数据。

    preferencesInstance.delete('username').then(() => {
        return preferencesInstance.delete('password');
    }).then(() => {
        return preferencesInstance.flush();
    }).catch((err) => {
        console.error("Failed to delete login data.", err);
    });
    
  5. 清除所有数据:

    使用clear方法清除Preferences中的所有数据。

    preferencesInstance.clear().then(() => {
        return preferencesInstance.flush();
    }).catch((err) => {
        console.error("Failed to clear preferences.", err);
    });
    

通过以上步骤,可以实现登录数据的本地缓存和管理。Preferences提供了一种简单且高效的方式来处理轻量级数据存储需求。

在HarmonyOS鸿蒙Next中,可以使用Preferences进行数据管理,将登录数据缓存到本地。具体步骤如下:

  1. 导入@ohos.data.preferences模块。
  2. 使用getPreferences方法获取Preferences实例。
  3. 使用put方法存储登录数据,如用户名和密码。
  4. 调用flush方法将数据持久化到本地。

示例代码:

import dataPreferences from '@ohos.data.preferences';

async function saveLoginData(context, key, value) {
  let preferences = await dataPreferences.getPreferences(context, 'userLoginData');
  await preferences.put(key, value);
  await preferences.flush();
}

这样,登录数据就会被安全地缓存到本地。

回到顶部