鸿蒙NEXT开辟-应用数据持久化之用户首选项(基于最新api12稳定版) ...

打印 上一主题 下一主题

主题 1013|帖子 1013|积分 3039

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,各人感爱好可以学习下
如果各人觉得博主文章写的好的话,可以点下关注,博主会不停更新鸿蒙next相关知识
专栏地址: https://blog.csdn.net/qq_56760790/category_12794123.html

鸿蒙next学习交流
qq群号:767465523
目次
1. 应用数据持久化
2. 应用数据持久化-用户首选项
2.1 概述
2.2 约束限制
2.3 常用方法
2.3.1 封装用户首选项工具类
2.3.2 初始化用户首选项
2.3.3 使用用户首选项
4. 学习地址


1. 应用数据持久化


应用数据持久化,是指应用将内存中的数据通过文件或数据库的情势保存到设备上。内存中的数据形态通常是恣意的数据结构或数据对象,存储介质上的数据形态大概是文本、数据库、二进制文件等。
HarmonyOS标准系统支持典范的存储数据形态,包括用户首选项、键值型数据库、关系型数据库。


  • 用户首选项(Preferences):通常用于保存应用的设置信息。数据通过文本的情势保存在设备中,应用使用过程中会将文本中的数据全量加载到内存中,所以访问速度快、服从高,但不适合须要存储大量数据的场景。
  • 键值型数据库(KV-Store):一种非关系型数据库,其数据以“键值”对的情势举行构造、索引和存储,其中“键”作为唯一标识符。适合很少数据关系和业务关系的业务数据存储,同时因其在分布式场景中低落相识决数据库版本兼容问题的复杂度,和数据同步过程中辩论解决的复杂度而被广泛使用。相比于关系型数据库,更容易做到跨设备跨版本兼容。
  • 关系型数据库(RelationalStore):一种关系型数据库,以行和列的情势存储数据,广泛用于应用中的关系型数据的处理,包括一系列的增、删、改、查等接口,开辟者也可以运行本身界说的SQL语句来满足复杂业务场景的须要。

2. 应用数据持久化-用户首选项


2.1 概述


用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。当用户希望有一个全局唯一存储的地方,可以采用用户首选项来举行存储。Preferences会将该数据缓存在内存中,当用户读取的时间,能够快速从内存中获取数据,当须要持久化时可以使用flush接口将内存中的数据写入持久化文件中。Preferences会随着存放的数据量越多而导致应用占用的内存越大,因此,Preferences不适合存放过多的数据,也不支持通过设置加密,实用的场景一样平常为应用保存用户的个性化设置(字体大小,是否开启夜间模式)等。

2.2 约束限制




  • 首选项无法保证进程并发安全,会有文件损坏和数据丢失的风险,不支持在多进程场景下使用。
  • Key键为string类型,要求非空且长度不超过1024个字节。
  • 如果Value值为string类型,请使用UTF-8编码格式,可以为空,不为空时长度不超过16 * 1024 * 1024个字节。
  • 内存会随着存储数据量的增大而增大,所以存储的数据量应该是轻量级的,发起存储的数据不超过一万条,否则会在内存方面产生较大的开销。

2.3 常用方法


参考华为官方文档:文档中心

注意:记得用真机或者模仿器运行

2.3.1 封装用户首选项工具类


注意:PreferencesUtil文件末端是ts不是ets

  1. import dataPreferences from '@ohos.data.preferences'
  2. import hilog from '@ohos.hilog';
  3. /**
  4. * 用户首选项(存储简单数据)
  5. */
  6. export default class PreferencesUtil {
  7.   // 用户首选项名称
  8.   private static preferenceName: string = 'myStore'
  9.   /**
  10.    * 创建
  11.    * @param context
  12.    */
  13.   static createPreferences(context) {
  14.     globalThis.getFontPreferences = (() => {
  15.       let preferences: Promise<dataPreferences.Preferences> =
  16.         dataPreferences.getPreferences(context, this.preferenceName);
  17.       return preferences;
  18.     });
  19.   }
  20.   /**
  21.    * 存放数据
  22.    * @param value
  23.    */
  24.   static savePreferencesValue(key: string, value: string) {
  25.     globalThis.getFontPreferences().then((preferences) => {
  26.       preferences.has(key).then(async (isExist) => {
  27.         if (!isExist) {
  28.           await preferences.put(key, value);
  29.           preferences.flush();
  30.         }
  31.       }).catch((err) => {
  32.         hilog.info(0xFF00, 'preferencesTag', '%{public}s', 'save PreferencesValue fail');
  33.       });
  34.     }).catch((err) => {
  35.       hilog.info(0xFF00, 'preferencesTag', '%{public}s', 'save PreferencesValue fail');
  36.     });
  37.   }
  38.   /**
  39.    * 获取数据
  40.    * @returns
  41.    */
  42.   static async getPreferencesValue(key: string) {
  43.     let value: string = '';
  44.     const preferences = await globalThis.getFontPreferences();
  45.     value = await preferences.get(key, value);
  46.     return value;
  47.   }
  48.   /**
  49.    * 删除数据
  50.    */
  51.   static async deletePreferencesValue(key: string) {
  52.     const preferences: dataPreferences.Preferences = await globalThis.getFontPreferences();
  53.     let deleteValue = preferences.delete(key);
  54.     deleteValue.then(() => {
  55.       hilog.info(0xFF00, 'preferencesTag', '%{public}s', 'delete PreferencesValue success');
  56.     }).catch((err) => {
  57.       hilog.info(0xFF00, 'preferencesTag', '%{public}s', 'delete PreferencesValue fail');
  58.     });
  59.   }
  60. }
复制代码

2.3.2 初始化用户首选项


在EntryAbility文件中初始化用户首选项


  1.   onWindowStageCreate(windowStage: window.WindowStage): void {
  2.     // 初始化用户首选项
  3.     PreferencesUtil.createPreferences(this.context);
  4.     // Main window is created, set main page for this ability
  5.     hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
  6.     windowStage.loadContent('pages/Index', (err) => {
  7.       if (err.code) {
  8.         hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
  9.         return;
  10.       }
  11.         hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.');
  12.     });
  13.   }
复制代码

2.3.3 使用用户首选项


注意:用户首选项存的值全局都可以获取到
  1. import PreferencesUtil from '../utils/PreferencesUtil'
  2. @Entry
  3.   @Component
  4.   struct Index {
  5.     build() {
  6.       Column() {
  7.         Text('存值')
  8.           .onClick(() => {
  9.             PreferencesUtil.savePreferencesValue('username', '东林')
  10.             console.log('preferences save success')
  11.           }).margin({bottom:50})
  12.         Divider()
  13.         Text('点我获取preferences值')
  14.           .onClick(async () => {
  15.             const username = await PreferencesUtil.getPreferencesValue('username')
  16.             console.log('preferences username:' + JSON.stringify(username))
  17.           }).margin({bottom:50})
  18.         Divider()
  19.         Text('删除')
  20.           .onClick(async () => {
  21.             await PreferencesUtil.deletePreferencesValue('username')
  22.             console.log('preferences remove success')
  23.           })
  24.       }
  25.       .height('100%')
  26.         .width('100%')
  27.     }
  28.   }
复制代码

4. 学习地址

全网首发鸿蒙NEXT星河版零基础入门到实战,2024年最新版,企业级开辟!视频连续更新中!_哔哩哔哩_bilibili



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

欢乐狗

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表