首页 > 其他分享 >保存应用数据

保存应用数据

时间:2024-01-21 22:22:22浏览次数:25  
标签:ets 字体大小 preferences err 保存 PreferencesUtil 应用 首选项 数据

概述

在移动互联网蓬勃发展的今天,移动应用给我们生活带来了极大的便利,这些便利的本质在于数据的互联互通。因此在应用的开发中数据存储占据了非常重要的位置,HarmonyOS应用开发也不例外。

本文将为您介绍HarmonyOS提供的数据管理能力之一首选项。

2 什么是首选项

首选项为应用提供Key-Value键值型的数据存储能力,支持应用持久化轻量级数据,并对其进行增删改查等。该存储对象中的数据会被缓存在内存中,因此它可以获得更快的存取速度,下面详细介绍下首选项的开发过程。

3 首选项运作机制

首选项的特点是:

1、以Key-Value形式存储数据

Key是不重复的关键字,Value是数据值。

2、非关系型数据库

区别于关系型数据库,它不保证遵循ACID(Atomicity, Consistency, Isolation and Durability)特性,数据之间无关系。

进程中每个文件仅存在一个Preferences实例,应用获取到实例后,可以从中读取数据,或者将数据存入实例中。通过调用flush方法可以将实例中的数据回写到文件里。

与关系数据库的区别

分类

关系型数据库

首选项

数据库类型

关系型

非关系型

使用场景

提供复杂场景下的本地数据库管理机制

对Key-Value结构的数据进行存取和持久化操作

存储方式

SQLite数据库

文件

约束与限制

1.连接池最大4个

2.同一时间只支持一个写操作

1.建议数据不超一万条

2.Key为string型

4 常用接口介绍

常用接口有:保存数据(put)、获取数据(get)、是否包含指定的key(has)、删除数据(delete)、数据持久化(flush)等,后面依次详细介绍接口使用。

常用接口使用前提

1、需要导入@ohos.data.preferences模块到PreferencesUtil开发环境中,实例名字命名为dataPreferences,同时定义两个常量PREFERENCES_NAME和KEY_APP_FONT_SIZE。(注:把常用接口封装在PreferencesUtil工具类里面,为了方便后面代码直接调用)相关代码实现如下:

// PreferencesUtil.ets
import dataPreferences from '@ohos.data.preferences';
   ...
  const PREFERENCES_NAME = 'myPreferences'; // 首选项名字
  const KEY_APP_FONT_SIZE = 'appFontSize';  // 首选项Key字段

2、需要在entryAbility的onCreate方法获取首选项实例,以便后续能进行保存、读取、删除等操作,获取实例需要上下文context和文件名字PREFERENCES_NAME,相关代码实现如下:

// entryAbility.ets  
  onCreate(want, launchParam) {
    Logger.info(TAG, 'onCreate');
    globalThis.abilityWant = want;
    // 创建首选项
    PreferencesUtil.createFontPreferences(this.context);
    ...
  }
// PreferencesUtil.ets  
  createFontPreferences(context) {
    globalThis.getFontPreferences = (() => {
      // 获取首选项实例
      let preferences: Promise = dataPreferences.getPreferences(context, PREFERENCES_NAME);
      return preferences;
    });
  }

保存数据(put)

1、在entryAbility的onCreate方法,调用PreferencesUtil.saveDefaultFontSize保存默认数据,先用has方法判断当前key是否有存在,如果没有就通过put方法把用户数据保存起来,该方法通过key-value键值对方式保存,常量KEY_APP_FONT_SIZE作为key,用户数据fontSize作为value,再通过flush方法把数据保存到文件,相关代码实现如下:

// entryAbility.ets  
  onCreate(want, launchParam) {
    Logger.info(TAG, 'onCreate');
    globalThis.abilityWant = want;
    ...
    // 设置字体默认大小
    PreferencesUtil.saveDefaultFontSize(Constants.SET_SIZE_STANDARD);
  }
// PreferencesUtil.ets    
  saveDefaultFontSize(fontSize: number) {
    globalThis.getFontPreferences().then((preferences) => {
      // 判断保存的key是否存在
      preferences.has(KEY_APP_FONT_SIZE).then(async (isExist) => {
        Logger.info(TAG, 'preferences has changeFontSize is ' + isExist);
        if (!isExist) {
          // 保存数据
          await preferences.put(KEY_APP_FONT_SIZE, fontSize);
          preferences.flush();
        }
      }).catch((err) => {
        Logger.error(TAG, 'Has the value failed with err: ' + err);
      });
    }).catch((err) => {
      Logger.error(TAG, 'Get the preferences failed, err: ' + err);
    });
  }

2、在SetFontSizePage页面,当手指移动Slider滑动条时,在onChange方法回调当前进度值,把当前进度值通过PreferencesUtil.saveChangeFontSize方法保存起来,再通过flush方法把数据保存到文件,相关代码实现如下:

// SetFontSizePage.ets
  build() {
    Row() {
      Slider({
       ...
      }).onChange((value: number) => {
          // 保存当前进度值
          PreferencesUtil.saveChangeFontSize(this.changeFontSize);
      })
    }
  }
// PreferencesUtil.ets 
  saveChangeFontSize(fontSize: number) {
    globalThis.getFontPreferences().then(async (preferences) => {
      // 保存数据
      await preferences.put(KEY_APP_FONT_SIZE, fontSize);
      preferences.flush();
    }).catch((err) => {
      Logger.error(TAG, 'put the preferences failed, err: ' + err);
    });
  }

获取数据(get)

在HomePage的onPageShow方法,调用PreferencesUtil.getChangeFontSize方法获取用户数据,调用get方法获取,该方法通过key-value键值对方式读取,常量KEY_APP_FONT_SIZE作为key,默认数据fontSize作为value,把的到的结果赋值给变量fontSize,通过return方式把值返回去,相关代码实现如下:

// HomePage.ets
  onPageShow() {
    PreferencesUtil.getChangeFontSize().then((value) => {
      this.changeFontSize = value;
      Logger.info(TAG, 'Get the value of changeFontSize: ' + this.changeFontSize);
    });
  }
// PreferencesUtil.ets 
  async getChangeFontSize() {
    let fontSize: number = 0;
    const preferences = await globalThis.getFontPreferences();
    fontSize = await preferences.get(KEY_APP_FONT_SIZE, fontSize);
    return fontSize;
  }

是否包含指定的key(has)

通过has方法判断首选项中是否包含指定的key,保证指定的key不会被重复保存,相关代码实现如下:

// PreferencesUtil.ets    
  saveDefaultFontSize(fontSize: number) {
    globalThis.getFontPreferences().then((preferences) => {
      // 判断保存的key是否存在
      preferences.has(KEY_APP_FONT_SIZE).then(async (isExist) => {
        Logger.info(TAG, 'preferences has changeFontSize is ' + isExist);
      }).catch((err) => {
        Logger.error(TAG, 'Has the value failed with err: ' + err);
      });
    }).catch((err) => {
      Logger.error(TAG, 'Get the preferences failed, err: ' + err);
    });
  }

数据持久化(flush)

通过flush方法把应用数据保存到文件中,使得应用数据保存期限变长,相关代码实现如下:

// PreferencesUtil.ets 
  saveChangeFontSize(fontSize: number) {
    globalThis.getFontPreferences().then(async (preferences) => {
      // 保存数据
      await preferences.put(KEY_APP_FONT_SIZE, fontSize);
     // 数据持久化
      preferences.flush();
    }).catch((err) => {
      Logger.error(TAG, 'put the preferences failed, err: ' + err);
    });
  }

删除数据(delete)

删除首选项数据需要获取preferences实例,用delete方法删除指定的key所对应的值,常量KEY_APP_FONT_SIZE作为key,通过Promise异步回调是否删除成功,相关代码实现如下:

// PreferencesUtil.ets 
  async deleteChangeFontSize() {
    const preferences: dataPreferences.Preferences = await globalThis.getFontPreferences();
    // 删除数据
    let deleteValue = preferences.delete(KEY_APP_FONT_SIZE);
    deleteValue.then(() => {
      Logger.info(TAG, 'Succeeded in deleting the key appFontSize.');
    }).catch((err) => {
      Logger.error(TAG, 'Failed to delete the key appFontSize. Cause: ' + err);
    });
  }

5 参考链接

  1. 首选项参考:首选项。 案例:应用内字体大小调节
  2. 介绍

    本篇Codelab将介绍如何使用基础组件Slider,通过拖动滑块调节应用内字体大小。要求完成以下功能:

    1. 实现两个页面的UX:主页面和字体大小调节页面。
    2. 拖动滑块改变字体大小系数,列表页和调节页面字体大小同步变化。往右拖动滑块字体变大,反之变小。
    3. 字体大小支持持久化存储,再次启动时,应用内字体仍是调节后的字体大小。

    最终效果图如图所示:

    相关概念

    • 字体大小调节原理:通过组件Slider滑动,获取滑动数值,将这个值通过首选项进行持久化,页面的字体通过这个值去改变大小。
    • 首选项:首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。

    完整实例

    gitee源码地址

    源码下载   应用内字体大小调节(ArkTS).zip   环境搭建

    我们首先需要完成HarmonyOS开发环境搭建,可参照如下步骤进行。

    软件要求

    硬件要求

    • 设备类型:华为手机或运行在DevEco Studio上的华为手机设备模拟器。
    • HarmonyOS系统:3.1.0 Developer Release。

    环境搭建

    1. 安装DevEco Studio,详情请参考下载和安装软件
    2. 设置DevEco Studio开发环境,DevEco Studio开发环境需要依赖于网络环境,需要连接上网络才能确保工具的正常使用,可以根据如下两种情况来配置开发环境:
      • 如果可以直接访问Internet,只需进行下载HarmonyOS SDK操作。
      • 如果网络不能直接访问Internet,需要通过代理服务器才可以访问,请参考配置开发环境
    3. 开发者可以参考以下链接,完成设备调试的相关配置:
      代码结构解读

    本篇Codelab只对核心代码进行讲解,对于完整代码,我们会在源码下载或gitee中提供。

        No Preview
    1. ├──entry/src/main/ets // ArkTS代码区
    2. │ ├──common
    3. │ │ ├──constants
    4. │ │ │ ├──CommonConstants.ets // 公共常量类
    5. │ │ │ └──StyleConstants.ets // 属性常量类
    6. │ │ ├──database
    7. │ │ │ └──PreferencesUtil.ets // 首选项数据操作工具类
    8. │ │ └──utils
    9. │ │ ├──GlobalContext.ets // 全局上下文工具类
    10. │ │ └──Logger.ets // 日志工具类
    11. │ ├──entryability
    12. │ │ └──EntryAbility.ets // 程序入口类
    13. │ ├──pages
    14. │ │ ├──HomePage.ets // 主页面
    15. │ │ └──SetFontSizePage.ets // 字体大小调节页面
    16. │ ├──view
    17. │ │ ├──ChatItemComponent.ets // 字体大小调节页面聊天Item组件
    18. │ │ ├──SettingItemComponent.ets // 主页面列表Item组件
    19. │ │ └──TitleBarComponent.ets // 页面标题栏组件
    20. │ └──viewmodel
    21. │ ├──ChatData.ets // 聊天列表数据类
    22. │ ├──HomeViewModel.ets // 主页面数据模型
    23. │ ├──ItemDirection.ets // 聊天数据位置
    24. │ └──SettingData.ets // 设置列表数据类
    25. │ └──SetViewModel.ets // 字体大小调节页面数据模型
    26. └──entry/src/main/resources // 资源文件目录
    保存默认大小

    应用初始化时,为了保证页面中文本的正常显示。在entryAbility生命周期onCreate方法处,添加一个命名为“myPreferences”的首选项表。在表中添加一个名为“appFontSize”的字段,保存默认字体大小。

        No Preview
    1. // PreferencesUtil.ets
    2. // 导入首选项数据库
    3. import dataPreferences from '@ohos.data.preferences';
    4. export class PreferencesUtil {
    5. // 先将Promise<Preferences>保存到全局
    6. createFontPreferences(context: Context) {
    7. let fontPreferences: Function = (() => {
    8. let preferences: Promise<dataPreferences.Preferences> = dataPreferences.getPreferences(context,
    9. PREFERENCES_NAME);
    10. return preferences;
    11. });
    12. GlobalContext.getContext().setObject('getFontPreferences', fontPreferences);
    13. }
    14. // 保存默认字体大小
    15. saveDefaultFontSize(fontSize: number) {
    16. let getFontPreferences: Function = GlobalContext.getContext().getObject('getFontPreferences') as Function;
    17. getFontPreferences().then((preferences: dataPreferences.Preferences) => {
    18. preferences.has(KEY_APP_FONT_SIZE).then(async (isExist: boolean) => {
    19. Logger.info(TAG, 'preferences has changeFontSize is ' + isExist);
    20. if (!isExist) {
    21. await preferences.put(KEY_APP_FONT_SIZE, fontSize);
    22. preferences.flush();
    23. }
    24. }).catch((err: Error) => {
    25. Logger.error(TAG, 'Has the value failed with err: ' + err);
    26. });
    27. }).catch((err: Error) => {
    28. Logger.error(TAG, 'Get the preferences failed, err: ' + err);
    29. });
    30. }
    31. }
    获取字体大小

    在HomePage页面加载显示的时候,即生命周期onPageShow方法处,通过PreferencesUtil工具类中的getChangeFontSize方法读取首选项中的数据。

    将读取到的数据保存到页面带有@State的变量中,通过这个变量对文本字体大小进行设置。

        No Preview
    1. // HomePage.ets
    2. onPageShow() {
    3. PreferencesUtil.getChangeFontSize().then((value) => {
    4. this.changeFontSize = value;
    5. Logger.info(TAG, 'Get the value of changeFontSize: ' + this.changeFontSize);
    6. })
    7. }
    8. // PreferencesUtil.ets工具类
    9. async getChangeFontSize() {
    10. let fontSize: number = 0;
    11. let getFontPreferences: Function = GlobalContext.getContext().getObject('getFontPreferences') as Function;
    12. fontSize = await (await getFontPreferences()).get(KEY_APP_FONT_SIZE, fontSize);
    13. return fontSize;
    14. }
    修改字体大小

    在应用主页面,点击设置字体大小,可以跳转到字体大小调节页面。拖动滑块修改数据后,SetFontSizePage页面的Slider组件监听到onChange事件,改变字体大小后,调用PreferencesUtil工具类中saveChangeFontSize方法写入本条数据即可。

        No Preview
    1. // SetFontSizePage.ets
    2. Slider({
    3. value: this.changeFontSize === CommonConstants.SET_SIZE_HUGE ?
    4. CommonConstants.SET_SLIDER_MAX : this.changeFontSize,
    5. min: CommonConstants.SET_SLIDER_MIN,
    6. max: CommonConstants.SET_SLIDER_MAX,
    7. step: CommonConstants.SET_SLIDER_STEP,
    8. style: SliderStyle.InSet
    9. })
    10. ...
    11. .onChange(async (value: number) => {
    12. if (this.changeFontSize === 0) {
    13. this.changeFontSize = await PreferencesUtil.getChangeFontSize();
    14. this.fontSizeText = SetViewModel.getTextByFontSize(value);
    15. return;
    16. }
    17. // 获取改变后的字体大小
    18. this.changeFontSize = (value === CommonConstants.SET_SLIDER_MAX ?
    19. CommonConstants.SET_SIZE_HUGE : value);
    20. // 获取字体大小的文本
    21. this.fontSizeText = SetViewModel.getTextByFontSize(this.changeFontSize);
    22. // 保存数据
    23. PreferencesUtil.saveChangeFontSize(this.changeFontSize);
    24. })
    25. // PreferencesUtil.ets工具类
    26. saveChangeFontSize(fontSize: number) {
    27. let getFontPreferences: Function = GlobalContext.getContext().getObject('getFontPreferences') as Function;
    28. getFontPreferences().then(async (preferences: dataPreferences.Preferences) => {
    29. await preferences.put(KEY_APP_FONT_SIZE, fontSize);
    30. preferences.flush();
    31. }).catch((err: Error) => {
    32. Logger.error(TAG, 'put the preferences failed, err: ' + err);
    33. });
    34. }
    总结

    您已经完成了本次Codelab的学习,并了解到以下知识点:

    1. 使用Slider实现滑动条。
    2. 使用首选项实现持久化应用轻量级数据。

     

     

     

     

     

       

     

标签:ets,字体大小,preferences,err,保存,PreferencesUtil,应用,首选项,数据
From: https://www.cnblogs.com/flyingsir/p/17978573

相关文章

  • MSFlexGrid应用
    SubOnLButtonDown(ByValItem,ByValFlags,ByValx,ByValy)DimobjConnectionDimobjCommandDimobjRecordsetDimstrConnectionStringDimstrSQL,sSQLDimkWh,PFC,kW,A1,A2,A3,V1,V2,V3,Line_Name,Meter_ID,Line_IDDimstrkWh,strkW,strPFC,strA1,strA2,strA3,st......
  • 给应用添加动画
    属性动画的使用 概述属性动画,是最为基础的动画,其功能强大、使用场景多,应用范围较广。常用于如下场景中:一、页面布局发生变化。例如添加、删除部分组件元素。二、页面元素的可见性和位置发生变化。例如显示或者隐藏部分元素,或者将部分元素从一端移动到另外一端。三、页......
  • docker容器使用存储卷进行数据持久化
    1.将存储卷"test01"挂载到容器,若不存在则直接创建,默认权限为rw[root@centos201~]#dockercontainerrun-vtest01:/usr/share/nginx/html-d--nameweb01nginx:1.20.168f7609b7d72ba6e328605103cfb315b1a38aa2631ce69a576a228d1037300aa[root@centos201~]#[17:22:......
  • 【OpenCV】:浅析 OpenCV 中的图像数据结构 Mat
    以下内容主要来自OpenCV中的mat.hpp这个头文件关于MatMat是OpenCV中用来存储图像数据的基础数据结构,原话是Itcanbeusedtostorerealorcomplex-valuedvectorsandmatrices,grayscaleorcolorimages,voxelvolumes,vectorfields,pointclouds,tensors,......
  • docker数据持久化(存储卷)
    1.查看现有的存储卷[root@centos201~]#dockervolumels#查看现有的存储卷DRIVERVOLUMENAME[root@centos201~]#2.创建随机(匿名)的存储卷[root@centos201~]#dockervolumecreate#创建随机(匿名)的存储卷050d2f963345d595c827551adc27ee48d61d482bfcf7c86......
  • [Mac软件]App Cleaner & Uninstaller 8.2.6应用程序清理和卸载
    AppCleaner&Uninstaller是一款Mac应用程序,它可以帮助用户完全删除应用程序及其相关的服务文件、扩展文件等。以下是该应用程序的主要功能:完全删除应用程序:通过将应用程序图标拖到垃圾桶中删除程序,可以彻底清除应用程序及其相关文件,释放磁盘空间。删除所有类型的服务文件:除了删除......
  • 「闲话随笔」【数据删除】考试题解
    「闲话随笔」【数据删除】考试题解点击查看目录目录「闲话随笔」【数据删除】考试题解T2T3T4T5T6T7T1T8T9被教练斩了.级部为啥不让公布分数?哦好像确实不该.咋四机房就我还没停whk,那我还挺高贵的.昨天中午saidtoFLORIZ:感觉现在是提前体验退役生活了,回班之后小测......
  • JAVA数据类型
    所有数据类型基本数据类型间的转换->自动类型转换->强制类型转换->基本数据类型间转换练习题基本数据类型和String类型间的转换->基本数据类型转为String类型->String数据类型转为基本数据类型......
  • 调研 7 个开源项目后,这家数据合规平台如何构建高性能网关
    作者:张俊,杭州用九智汇科技有限公司系统架构师用九智汇介绍用九智汇是一家面向企业提供数据合规、隐私保护相关产品和解决方案的数据合规公司,致力于帮助客户在合法合规、充分保护用户隐私的基础上发挥数据的最大价值,已服务众多世界500强企业。当前我们的产品交付主要基于云原生......
  • 使用Gin框架往数据库插入记录
    首先往数据库插入数据,就需要连接数据库(笔者此处使用的是PostgreSQL)因此在项目中引入如下依赖(这两个依赖版本号不一致,可能会出现异常)gorm.io/driver/postgres  //依赖是用于连接和操作PostgreSQL数据库gorm.io/gorm  //对象关系映射(ORM)库,简化Golang程序与数据库......