HarmonyOS首选项ohos.data.preferences存储获取数据完整最新版

 

// 单ets页面使用使用用户首选项preference存储持久化数据以及获取示范 存储完成之后可在当前项目全局使用

// 若未封装通用方法则每次使用都需要先获取Preferences实例

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

import common from '@ohos.app.ability.common';

import hilog from '@ohos.hilog';

let myPer = null

@Component

@Entry

export struct SplashPage {

  // 注意上下文context只能在@Entry装饰的对象内获取到

  context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext

  aboutToAppear() {

    // 尝试获取到Preferences实例  也可封装方法调用

    try {

      // 初始化用户首选项实例

      let promise = data_preferences.getPreferences(this.context, 'mystore'); // mystore 自定义命名

      promise.then((object) => {

        myPer = object; //赋值给全局变量myPer,方便后续调用

        console.info("Succeeded in getting preferences.");

      }).catch((err) => {

        console.error("Failed to get preferences. code =" + err.code + ", message =" + err.message);

      })

    } catch (err) {

      console.error("Failed to get preferences. code =" + err.code + ", message =" + err.message);

    }

  }

  putPer() {

    // 方法1 不调用myPer直接初始化首选项实例然后使用  可实现  userInfo自定义命名

    // data_preferences.getPreferences(this.context, 'userInfo').then(preferences => {

    //   preferences.put('agree', 1).then(() => {

    //     preferences.flush()

    //   })

    // })

    //  方法2 调用myPer 可实现

    let promise = myPer.put('status', 'hello') //存储status,默认值为’hello‘

    // 存储之前也可先调用has方法判断是否已存在对应的key,若存在则覆盖,反之则写入,方法参考官网

    myPer.flush() // 实例持久化操作

    let all = myPer.getAll() // 获取所有的数据

    all.then(res => {

      console.log(JSON.stringify(res)) // 打印结果 {"status":"hello"}

    })

  }

  getPer() {

    // data_preferences.getPreferences(getContext(this), 'userInfo').then(preferences => {

    //   preferences.get('agree', 0).then(value => {

    //     // hilog.info(0xF0000, 'dbTest', '%{public}s', value)

    //     console.log('value=', value)

    //   })

    // })

    let promise = myPer.get('status', '0') //这里的0是代表获取不到的时候设置的默认值,必填,可为空

    promise.then(res => {

      console.log(res) // hello

    })

  }

  build() {

    Column() {

      Button('put').onClick(() => {

        this.putPer()

      })

      Button('get').onClick(() => {

        this.getPer()

      })

    }

  }

}

//  封装方法实现  任意js或者ts文件

// 步骤一 pages/utils/index.ts 我的文件路径

import common from '@ohos.app.ability.common';

import data_preferences from '@ohos.data.preferences'

import defaultAppManager from '@ohos.bundle.defaultAppManager';

class Store {

  private preferences;

  private context;

  set(key: string, val: any) {

    this.preferences.put(key, val);

    this.preferences.flush(); // 持久化

  }

  get(key: string) {

    return new Promise(async (resolve, reject) => {

      if (!this.preferences) {

        data_preferences.getPreferences(this.context, 'mystore').then(val => {

          console.log('用户首选项初始化成功')

          this.preferences = val;

          this.preferences.get(key, false, (err, res) => {

            if (err) return reject(err)

            resolve(res)

          })

        })

      } else {

        this.preferences.get(key, false, (err, res) => {

          if (err) return reject(err)

          resolve(res)

        })

      }

    })

  }

  delete(key: string) {

    this.preferences.delete(key);

    this.preferences.flush(); // 持久化

  }



  initStore(context: common.UIAbilityContext) {

    this.context = context;

    data_preferences.getPreferences(context, 'mystore').then(val => {

      console.log('用户首选项初始化成功')

      this.preferences = val;

    })

  }

}

export default new Store();

// 步骤二 找到ets/entryability/EntryAbility.ts

import 引入前面的index.ts文件 

然后在onCreate里面初始化,只需要做这两个操作即可,其余部分未做任何修改 注意路径问题,完整代码如下,

import UIAbility from '@ohos.app.ability.UIAbility';

import hilog from '@ohos.hilog';

import window from '@ohos.window';

import useStore from '../pages/utils/Index'

export default class EntryAbility extends UIAbility {

  onCreate(want, launchParam) {

    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');

    useStore.initStore(this.context);

  }

  onDestroy() {

    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');

  }

  onWindowStageCreate(windowStage: window.WindowStage) {

    // Main window is created, set main page for this ability

    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');

    windowStage.loadContent('pages/Index', (err, data) => {

      if (err.code) {

        hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');

        return;

      }

      hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '');

    });

  }

  onWindowStageDestroy() {

    // Main window is destroyed, release UI related resources

    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');

  }

  onForeground() {

    // Ability has brought to foreground

    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');

  }

  onBackground() {

    // Ability has back to background

    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');

  }

}

// 步骤三 使用  任意自己的ets文件 

// ChildSeven.ets  注意get和set方法的传参不同,因为在前面index.ets内自定义了,可以自己修改和增加其他方法

import router from '@ohos.router';

import useStore from '../utils/Index'

@Component

export struct child7 {

  build() {

    Column() {

      Text('seven')

    }

  }

}

@Entry

@Component

struct parent {

  @State arr: number[] = [10, 20, 30]

  async aboutToAppear() {

    // 此处获取的status是前面已经存储的status 持久化数据

    let status = await useStore.get('status')

    console.log('status=', status)

    // 存储类型和浏览器的localStorage是一样的

    await useStore.set('myData', JSON.stringify(this.arr))

  }

  build() {

    Column() {

      Button('change').onClick((event: ClickEvent) => {

        // 获取存储的myData

        let myData = useStore.get('myData')

        myData.then(res => {

          console.log('res=', res)

        })

      })

      Divider()

      child7()

    }

  }

}

这就是完整的示范了,附加的其他操作比如数据更新等请看官方文档,小白创作不易,多多点赞支持下。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值