当前位置:   article > 正文

HarmonyOS进行本地化存储-Preferences封装_hormonyos 封装preferences

hormonyos 封装preferences

官方链接:HarmonyOS-Preferences

数据持久化简述

非关系型数据库-对Key-Value结构的数据进行存取和持久化操作

轻量级数据存储功能通常用于保存应用的一些常用配置信息,并不适合需要存储大量数据和频繁改变数据的场景。应用的数据保存在文件中,这些文件可以持久化地存储在设备上。需要注意的是,应用访问的实例包含文件所有数据,这些数据会一直加载在设备的内存中,直到应用主动从内存中将其移除前,应用可以通过Preferences的API进行数据操作

常用接口介绍

  • 保存数据(put)
  • 获取数据(get)
  • 是否包含指定的key(has)
  • 删除数据(delete)
  • 数据持久化(flush)

基本使用与封装

Preferences提供了获取实例、读、取、删对应操作的方法:

  • getPreferences(context,name):获取Preferences实例,name是存储的文件名;
  • get(k):通过key获取value值;
  • getAll():获取文件所有的值;
  • put(k,v):添加值,同一个key会将之前的值覆盖掉,需要通过flush()刷新到文件中;
  • delete(k):通过key删除对应的value值;
  • clear():删除所有的存储值。

注意:以上方法都是异步的。

下面对preferences 进行封装,基本思路:

在获取preferences实例后会将其保存单例中,这个单例是GlobalContext,方便后期可以通过单例直接获取实例;由于get()返回值类型是不确定性,定义一个联合类型的别名ValueType 来接收

  1. import dataPreferences from '@ohos.data.preferences'
  2. import GlobalContext from '../../common/GlobalContext'
  3. import { LogUtils } from '../LogUtils'
  4. const LOG = 'PreferencesUtils-PUT'
  5. // 默认文件名(数据库表名),可以在构造函数进行修改
  6. const PREFERENCES_NAME = 'scjgPreferences'
  7. const KEY_PREFERENCES = 'preferences'
  8. type ValueType = number | string | boolean | Array<number> | Array<string> | Array<boolean>
  9. class PreferencesUtils {
  10. // preferences的文件名-数据库表名
  11. private preferencesName: string = PREFERENCES_NAME
  12. // 用于获取preferences实例的key值,保存到单例中
  13. private keyPreferences: string = KEY_PREFERENCES
  14. constructor(name: string = PREFERENCES_NAME, key: string = KEY_PREFERENCES) {
  15. this.preferencesName = name
  16. this.keyPreferences = key
  17. }
  18. /**
  19. * 创建首选项实例
  20. * @param context: 应用上下文
  21. * @param preferencesName: 数据库表名
  22. * @returns
  23. */
  24. createPreferences(context): Promise<dataPreferences.Preferences> {
  25. let preferences = dataPreferences.getPreferences(context, this.preferencesName)
  26. GlobalContext.getContext().setObject(this.keyPreferences, preferences)
  27. return
  28. }
  29. /**
  30. * 获取首选项实例
  31. * @returns
  32. */
  33. getPreferences(): Promise<dataPreferences.Preferences> {
  34. return GlobalContext.getContext().getObject(this.keyPreferences) as Promise<dataPreferences.Preferences>
  35. }
  36. /**
  37. * 获取数据
  38. * @param key: 读取key值
  39. * @param def: 函数出参
  40. * @returns
  41. */
  42. async get(key: string, def?: ValueType): Promise<ValueType> {
  43. return (await this.getPreferences()).get(key, def)
  44. }
  45. // 获取全部数据
  46. async getAll(): Promise<Object> {
  47. let preferences = await this.getPreferences()
  48. return preferences.getAll()
  49. }
  50. /**
  51. * 插入数据
  52. * @param key: 存入key值
  53. * @param value: 存储数据
  54. * @returns
  55. */
  56. async put(key: string, value: ValueType): Promise<void> {
  57. let promise = await this.getPreferences().then(async preferences => {
  58. // 插入数据
  59. await preferences.put(key, value)
  60. // 写入文件
  61. await preferences.flush()
  62. }).catch(error => {
  63. LogUtils.error(LOG, `code:${error.code}, message:${error.message}`)
  64. })
  65. return promise
  66. }
  67. /**
  68. * 删除数据
  69. * @param key: 删除key的value值
  70. * @returns
  71. */
  72. async delete(key: string): Promise<void> {
  73. return (await this.getPreferences()).delete(key).finally(async () => {
  74. (await this.getPreferences()).flush()
  75. })
  76. }
  77. // 清空数据
  78. async clear(): Promise<void> {
  79. return (await this.getPreferences()).clear().finally(async () => {
  80. (await this.getPreferences()).flush()
  81. })
  82. }
  83. }
  84. export default new PreferencesUtils()

EntryAbility中onCreate()方法初始化:

  1. export default class EntryAbility extends UIAbility {
  2. onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
  3. PreferencesUtils.createPreferences(this.context)
  4. hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate')
  5. }
  6. }

GlobalContext

  1. export default class GlobalContext {
  2. private constructor() {}
  3. private static instance: GlobalContext
  4. private _objects = new Map<string, Object>()
  5. public static getContext(): GlobalContext {
  6. if (!GlobalContext.instance) {
  7. GlobalContext.instance = new GlobalContext()
  8. }
  9. return GlobalContext.instance
  10. }
  11. getObject(value: string): Object | undefined {
  12. return this._objects.get(value)
  13. }
  14. setObject(key: string, objectClass: Object): void {
  15. this._objects.set(key, objectClass)
  16. }
  17. }

测试用例

图一:getAll        图二:put

注意:插入数据key相同时,会自动修改替换value值

代码示例

  1. import PreferencesUtils from '../../utils/storage/Preference'
  2. @Entry
  3. @Component
  4. struct Index {
  5. @State text: string = ''
  6. aboutToAppear() {
  7. PreferencesUtils.put('userName', '张三')
  8. PreferencesUtils.put('age', '24')
  9. PreferencesUtils.put('sex', '男')
  10. }
  11. async getAll() {
  12. this.text = JSON.stringify(await PreferencesUtils.getAll() as Object)
  13. console.log('getAll', this.text)
  14. }
  15. build() {
  16. Column() {
  17. Text(this.text)
  18. .width('100%')
  19. .height(60)
  20. Row() {
  21. Button('get')
  22. .onClick(async () => {
  23. this.text = await PreferencesUtils.get('userName') as string
  24. })
  25. Button('getAll')
  26. .onClick(async () => {
  27. this.getAll()
  28. })
  29. Button('put')
  30. .onClick(async () => {
  31. await PreferencesUtils.put('userName', '李四')
  32. await PreferencesUtils.put('age', 25)
  33. await PreferencesUtils.put('sex', '女')
  34. this.getAll()
  35. })
  36. Button('delete')
  37. .onClick(async () => {
  38. await PreferencesUtils.delete('sex')
  39. this.getAll()
  40. })
  41. Button('clear')
  42. .onClick(async () => {
  43. await PreferencesUtils.clear()
  44. this.getAll()
  45. })
  46. }
  47. .width('100%')
  48. .justifyContent(FlexAlign.Center)
  49. }.margin({ top: 50 })
  50. }
  51. }

参考

  • https://developer.huawei.com/consumer/cn/training/course/slightMooc/C101667367018821971?ha_linker=eyJ0cyI6MTcwMjM5NzEzNzM3MywiaWQiOiI4MmM3ZTI1MmFmMDJlMDZiODBmOGU1ZDM5ZTI5YmMyOCJ9
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/314656
推荐阅读
相关标签
  

闽ICP备14008679号