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

ArkTS---保存应用数据

时间:2024-08-21 10:52:44浏览次数:14  
标签:ArkTS console Preferences err dataPreferences 保存 --- 实例 数据

前言---Preferences

        用户首选项Preferences,适用于对轻量级的Key-Value结构的数据进行存取和持久化操作。

        Key-Value数据结构:一种键值型的数据结构,Key是不重复的关键字,Value是数据值。

        非关系型数据库:区别于关系型数据库,不保证遵循ACID特性,不采用关系模型来组织数据,数据之间无关系。

        限制:

        1、Key为String类型,要求非空且长度不超过80个字节

        2、如果Value值为String类型,请使用UTF-8编码格式,可以为空,不为空时长度不超过8192个字节

        3、内存会随着存储数据量的增大而增大,所以存储的数据量应该是轻量级的,建议存储的数据不超过一万条,否则会在内存方面产生较大的开销

一、运作机制

        用户程序通过ArkTS接口调用用户首选项读写对应的数据文件。开发者可以将用户首选项持久化文件的内容加载到Preferences实例,每个文件唯一对应到一个Preferences实例,系统会通过静态容器将该实例存储在内存中,直到主动从内存中移除该实例或者删除该文件。

        

二、接口说明

接口名称描述
getPreferencesSync(context: Context, options: Options): Preferences获取Preferences实例。该接口存在异步接口。
putSync(key: string, value: ValueType): void将数据写入Preferences实例,可通过flush将Preferences实例持久化。该接口存在异步接口。
hasSync(key: string): boolean检查Preferences实例是否包含名为给定Key的存储键值对。给定的Key值不能为空。该接口存在异步接口。
getSync(key: string, defValue: ValueType): ValueType获取键对应的值,如果值为null或者非默认值类型,返回默认数据defValue。该接口存在异步接口。
deleteSync(key: string): void从Preferences实例中删除名为给定Key的存储键值对。该接口存在异步接口。
flush(callback: AsyncCallback<void>): void将当前Preferences实例的数据异步存储到用户首选项持久化文件中。
on(type: 'change', callback: Callback<string>): void订阅数据变更,订阅的数据发生变更后,在执行flush方法后,触发callback回调。
off(type: 'change', callback?: Callback<string>): void取消订阅数据变更。
deletePreferences(context: Context, options: Options, callback: AsyncCallback<void>): void从内存中移除指定的Preferences实例。若Preferences实例有对应的持久化文件,则同时删除其持久化文件。

 三、实现步骤

        1、导入@kit.ArkData模块 

import { preferences } from '@kit.ArkData';

        2、获取Preferences实例

// Stage模型示例
import { UIAbility } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { window } from '@kit.ArkUI';

let dataPreferences: preferences.Preferences | null = null;

class EntryAbility extends UIAbility {
  onWindowStageCreate(windowStage: window.WindowStage) {
    let options: preferences.Options = { name: 'myStore' };
    dataPreferences = preferences.getPreferencesSync(this.context, options);
  }
}

// FA模型示例
// 获取context
import { featureAbility } from '@kit.AbilityKit';
import { BusinessError } from '@kit.BasicServicesKit';

let context = featureAbility.getContext();
let options: preferences.Options =  { name: 'myStore' };
let dataPreferences: preferences.Preferences = preferences.getPreferencesSync(context, options);

        3、写入数据

        使用putSync()方法保存数据到缓存的Preferences实例中。在写入数据后,如有需要,可使用flush()方法将Preferences实例的数据存储到持久化文件。

        注意:当对应的键已经存在时,putSync()方法会覆盖其值。可以使用hasSync()方法检查是否存在对应键值对。

import { util } from '@kit.ArkTS';
if (dataPreferences.hasSync('startup')) {
  console.info("The key 'startup' is contained.");
} else {
  console.info("The key 'startup' does not contain.");
  // 此处以此键值对不存在时写入数据为例
  dataPreferences.putSync('startup', 'auto');
  // 当字符串有特殊字符时,需要将字符串转为Uint8Array类型再存储
  let uInt8Array1 = new util.TextEncoder().encodeInto("~!@#¥%……&*()——+?");
  dataPreferences.putSync('uInt8', uInt8Array1);
}

        4、读取数据

        使用getSync()方法获取数据,即指定键对应的值。如果值为null或者非默认值类型,则返回默认数据。

let val = dataPreferences.getSync('startup', 'default');
console.info("The 'startup' value is " + val);
// 当获取的值为带有特殊字符的字符串时,需要将获取到的Uint8Array转换为字符串
let uInt8Array2 : preferences.ValueType = dataPreferences.getSync('uInt8', new Uint8Array(0));
let textDecoder = util.TextDecoder.create('utf-8');
val = textDecoder.decodeWithStream(uInt8Array2 as Uint8Array);
console.info("The 'uInt8' value is " + val);

        5、删除数据

        使用deleteSync()方法删除指定键值对。

dataPreferences.deleteSync('startup');

        6、数据持久化

        应用存入数据到Preferences实例后,可以使用flush()方法实现数据持久化。

dataPreferences.flush((err: BusinessError) => {
  if (err) {
    console.error(`Failed to flush. Code:${err.code}, message:${err.message}`);
    return;
  }
  console.info('Succeeded in flushing.');
})

        7、订阅数据变更

        应用订阅数据变更需要指定observer作为回调方法。订阅的Key值发生变更后,当执行flush()方法时,observer被触发回调。

let observer = (key: string) => {
  console.info('The key' + key + 'changed.');
}
dataPreferences.on('change', observer);
// 数据产生变更,由'auto'变为'manual'
dataPreferences.put('startup', 'manual', (err: BusinessError) => {
  if (err) {
    console.error(`Failed to put the value of 'startup'. Code:${err.code},message:${err.message}`);
    return;
  }
  console.info("Succeeded in putting the value of 'startup'.");
  if (dataPreferences !== null) {
    dataPreferences.flush((err: BusinessError) => {
      if (err) {
        console.error(`Failed to flush. Code:${err.code}, message:${err.message}`);
        return;
      }
      console.info('Succeeded in flushing.');
    })
  }
})

        8、删除指定文件

        使用deletePreferences()方法从内存中移除指定文件对应的Preferences实例,包括内存中的数据。若该Preference存在对应的持久化文件,则同时删除该持久化文件,包括指定文件及其备份文件、损坏文件。

preferences.deletePreferences(this.context, options, (err: BusinessError) => {
  if (err) {
    console.error(`Failed to delete preferences. Code:${err.code}, message:${err.message}`);
      return;
  }
  console.info('Succeeded in deleting preferences.');
})

        注意:

        成功删除后,数据及文件将不可恢复;

        调用该接口后,应用不允许再使用该Preferences实例进行数据操作,否则会出现数据一致性问题。

标签:ArkTS,console,Preferences,err,dataPreferences,保存,---,实例,数据
From: https://blog.csdn.net/sinat_34896766/article/details/141353607

相关文章

  • MBR30100CT-ASEMI低压降肖特基MBR30100CT
    编辑:llMBR30100CT-ASEMI低压降肖特基MBR30100CT型号:MBR30100CT品牌:ASEMI封装:TO-220批号:最新恢复时间:35ns最大平均正向电流(IF):30A最大循环峰值反向电压(VRRM):100V最大正向电压(VF):0.70V~0.90V工作温度:-65°C~175°C芯片个数:2芯片尺寸:mil正向浪涌电流(IFMS):250AMBR30100CT特......
  • jian-li-blog
    建立自己的博客网站来装逼是不错的方式,在没有代码基础的情况下,Github可以提供免费的网站服务,你只需要有一个GitHub账号就可以了(注意GitHub需要用邮箱注册),在注册完成剩下的就按接下的步骤就行了1相关工具安装1.Node环境Hexo是基于Node.js驱动的一款博客框架,所以要先安装No......
  • VSCode系列 - 如何用VSCode搭建C++高效开发环境(2)
    1.插件的用法1.1.C/C++1.1.1.插件介绍1.1.2.插件配置1.2.Clang-Format1.3.cpp-check-lint1.3.1.cpplint1.3.2.cppcheck1.3.3.插件的使用1.4.C/C++AdvancedLint1.4.1.插件介绍1.4.2.插件配置1.5.BracketPairColorizer1.5.1.插件介绍1.......
  • WiFi简介-从技术原理到应用
    推荐:揭秘电池管理的全能王者,ADI车规级AFE芯片(Bipolar+CMOS双管芯)芯品快报:德州仪器(TI)的高性能、集成式的双全桥电机驱动器——DRV8412“做成ADC拿去诡市,贱卖!”-----长安红茶续篇WiFi简介-从技术原理到应用原创 IPBrain 集成电路大数据平台 2022年07月29日17:18 北京......
  • X-anylabeling如何手动加载(自定义)模型 : 以Segment Anything 为例
    提示:文章目录前言1手动下载模型至软件默认读取路径2加载自定义模型假设你已有模型(.pth),如何进行导出安装导出工具导出你的模型,在标注软件中加载模型打开软件,加载‘自定义’模型。并选择上面提到的配置文件X-anylabeling源码安装过程中遇到的问题GPU环境问题opencv......
  • JSP基于JSP的新闻发布及管理系统51u85--(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表技术要求:开发语言:JSP前端使用:HTML5,CSS,JSP动态网页技术后端使用SpringBoot,Spring技术主数据库使用MySQL开题报告内容一、项目背景与意义在信息爆炸的时......
  • Java并发编程 - JUC介绍、JUC锁(公平锁、非公平锁、可重入锁/递归锁、自旋锁、Reentran
    Java并发编程中的java.util.concurrent(简称JUC)包提供了许多高级并发工具和类,使得开发人员能够更加方便地编写高性能的并发程序。下面将详细介绍JUC包中的一些锁相关的概念和类。JUC介绍java.util.concurrent包提供了许多高级并发工具类,包括但不限于Executor框架......
  • 2024-08-21 关于vue3中使用emit的一些笔记
    问题1:emitisnotdefinedwatch(()=>content.value,(val)=>{emit('input',val);});原因:直接使用了未定义的emit导致报错。解决方案:使用vue3中的defineEmits函数定义一个可以定义触发的函数,比如constemit=defineEmits(['input']);此处的emit只是一个变量,你可......
  • 【2024-08-20】生活荣誉
    20:00要记住!情况越严重,越困难,就越需要坚定,积极,果敢,而消极无为就越有害。                                                 ——列夫·托尔斯泰昨天,在陪岳母检查完回家......
  • 机器学习--序列到序列模型总结
    序列到序列(Seq2Seq)模型的发展历程中,随着技术的进步和研究的深入,出现了多种不同的架构。这些架构在编码器-解码器结构的基础上逐步演化,融合了多种改进策略和创新方法。以下是总结出的主要Seq2Seq模型架构:1.基础的RNNSeq2Seq模型编码器和解码器:最早的Seq2Seq模型使用简单的......