HarmonyOS学习路之开发篇—数据管理(轻量级数据存储)

news2024/11/19 3:47:19

轻量级数据存储概述

轻量级数据存储适用于对Key-Value结构的数据进行存取和持久化操作。应用获取某个轻量级存储对象后,该存储对象中的数据将会被缓存在内存中,以便应用获得更快的数据存取速度。应用也可以将缓存的数据再次写回文本文件中进行持久化存储,由于文件读写将产生不可避免的系统资源开销,建议应用减少对持久化文件的读写频率。

基本概念

  • Key-Value数据结构

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

  • 非关系型数据库

    区别于关系数据库,不保证遵循ACID(Atomic、Consistency、Isolation及Durability)特性,不采用关系模型来组织数据,数据之间无关系。

运作机制

  1. 应用通过指定Preferences文件将其中的数据加载到Preferences实例,系统会通过静态容器将该实例存储在内存中,同一应用或进程中每个文件仅存在一个Preferences实例,直到应用主动从内存中移除该实例或者删除该Preferences文件。
  2. 应用获取到Preferences文件对应的实例后,可以从Preferences实例中读取数据,或者将数据存入Preferences实例中。通过调用flush或者flushSync方法可以将Preferences实例中的数据回写到文件里。

图1 轻量级数据存储运作机制

 

约束与限制

  • 因Preferences实例会加载到内存中,建议存储的数据不超过一万条,并及时清理不再使用的实例,以便减少非内存开销。
  • 数据中的key为string类型,要求非空且字符长度不超过80个。
  • 当数据中的value为string类型时,允许为空,字符长度不超过8192个。
  • 当value值为字符串型Set集合类型时,要求集合元素非空且字符长度不超过8192个。

轻量级数据存储开发

场景介绍

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

接口说明

轻量级存储为应用提供key-value键值型的文件数据处理能力,支持应用对数据进行轻量级存储及查询。数据存储形式为键值对,键的类型为字符串型,值的存储数据类型包括整型、字符串型、布尔型、浮点型、长整型、字符串型Set集合。

创建存储实例

读取指定文件,将数据加载到Preferences实例,即可创建一个存储实例,用于数据操作。

表1 轻量级数据存储实例创建接口

类名

接口名

描述

DatabaseHelper

DatabaseHelper(Context context)

DatabaseHelper是数据操作的辅助类。

DatabaseHelper

Preferences getPreferences(String name)

获取数据存储文件对应的Preferences单实例,用于数据操作。数据文件存放在由上下文指定的目录里,该路径会因指定不同的上下文存在差异。

存入数据

通过Put系列方法,可以增加或修改Preferences实例中的数据。

表2 轻量级偏好数据存入接口

类名

接口名

描述

Preferences

Preferences putInt(String key, int value)

设置Preferences实例中键对应的int类型的值。

Preferences

Preferences putString(String key, String value)

设置Preferences实例中键对应的String类型的值。

读取数据

通过调用Get系列方法,可以读取Preferences中的数据。

表3 轻量级数据读取接口

类名

接口名

描述

Preferences

int getInt(String key, int defValue)

获取键对应的int类型的值。

Preferences

float getFloat(String key, float defValue)

获取键对应的float类型的值。

数据持久化

通过执行flush方法,应用可以将缓存的数据再次写回文本文件中进行持久化存储。

表4 轻量级数据持久化接口

类名

接口名

描述

Preferences

void flush()

将Preferences实例异步写入文件。

Preferences

boolean flushSync()

将Preferences实例同步写入文件。

订阅数据变化

订阅数据变化需要指定PreferencesObserver作为回调方法。订阅的key的值发生变更后,当执行flush方法时,PreferencesObserver被回调。

表5 轻量级数据变化订阅接口

类名

接口名

描述

Preferences

void registerObserver(PreferencesObserver preferencesObserver)

订阅数据变化。

Preferences

void unRegisterObserver(PreferencesObserver preferencesObserver)

注销订阅。

Preferences.PreferencesObserver

void onChange(Preferences preferences, String key)

订阅者的回调方法,数据变化会触发回调该方法。

删除数据文件

通过调用以下两种接口,可以删除数据实例或对应的文件。

表6 轻量级数据存储删除接口

类名

接口名

描述

DatabaseHelper

boolean deletePreferences(String name)

将Preferences实例从内存中移除,同时删除其在设备上的持久化文件。

DatabaseHelper

void removePreferencesFromCache(String name)

仅将Preferences实例从内存中移除。

移动数据文件

表7 轻量级数据存储移动接口

类名

接口名

描述

DatabaseHelper

boolean movePreferences(Context sourceContext, String sourceName, String targetName)

移动数据持久化文件。

开发步骤

获取Preferences实例。

读取指定文件,将数据加载到Preferences实例,用于数据操作。

Context context = getContext(); // 数据文件存储路径:/data/data/{PackageName}/{AbilityName}/preferences。
// Context context = getApplicationContext(); // 数据文件存储路径:/data/data/{PackageName}/preferences。
DatabaseHelper databaseHelper = new DatabaseHelper(context); // context入参类型为ohos.app.Context。
String fileName = "test_pref"; // fileName表示文件名,其取值不能为空,也不能包含路径,默认存储目录可以通过context.getPreferencesDir()获取。
Preferences preferences = databaseHelper.getPreferences(fileName);

读取数据。

使用Preferences get方法读取数据。

preferences.putInt("intKey", 3);
preferences.putString("StringKey", "String value");

数据持久化。

应用存入数据到Preferences实例后,可以通过flush或者flushSync方法将Preferences实例回写到文件中。

preferences.flush();  // 异步方法
bool result = preferences.flushSync();  // 同步方法

订阅数据变化。

应用订阅数据变化需要指定PreferencesObserver作为回调方法。订阅的key的值发生变更后,当执行flush方法时,PreferencesObserver被触发回调。不再需要PreferencesObserver时请注销。

private class PreferencesObserverImpl implements Preferences.PreferencesObserver {
   
    @Override    
    public void onChange(Preferences preferences, String key) {
        if ("intKey".equals(key)) {
           HiLog.info(LABLE, "Change Received:[key=value]");        
        }    
    }
}

// 订阅数据变化
PreferencesObserverImpl observer = new PreferencesObserverImpl();
preferences.registerObserver(observer);
// 修改数据
preferences.putInt("intKey", 3);
// 触发订阅者回调方法执行
preferences.flush();
// 修改数据后,observer的onChange方法会被回调
// 注销订阅
preferences.unRegisterObserver(observer);

移除Preferences实例。

从内存中移除指定文件对应的Preferences单实例。移除Preferences单实例时,应用不允许再使用该实例进行数据操作,否则会出现数据一致性问题。

DatabaseHelper databaseHelper = new DatabaseHelper(context);
String fileName = "name"; // fileName表示文件名,其取值不能为空,也不能包含路径。
databaseHelper.removePreferencesFromCache(fileName);

删除指定文件。

使用deletePreferences方法从内存中移除指定文件对应的Preferences单实例,并删除指定文件及其备份文件、损坏文件。删除指定文件时,应用不允许再使用该实例进行数据操作,否则会出现数据一致性问题。删除后,数据及文件将不可恢复。

DatabaseHelper databaseHelper = new DatabaseHelper(context);
String fileName = "name"; // fileName表示文件名,其取值不能为空,也不能包含路径。
boolean result = databaseHelper.deletePreferences(fileName);

移动指定文件。

从源路径移动文件到目标路径。移动文件时,应用不允许再操作该文件数据,否则会出现数据一致性问题。

Context targetContext = getContext();
DatabaseHelper databaseHelper = new DatabaseHelper(targetContext);
String srcFile = "srcFile"; // srcFile表示源文件名或者源文件的绝对路径,不能为相对路径,其取值不能为空。当srcFile只传入文件名时,srcContext不能为空。
String targetFile = "targetFile"; // targetFile表示目标文件名,其取值不能为空,也不能包含路径。
Context srcContext = getApplicationContext();
boolean result = databaseHelper.movePreferences(srcContext, srcFile, targetFile);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/726710.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

设计模式之装饰者模式-TS中装饰器介绍

装饰器的基本介绍 装饰器是一种特殊类型的声明,它能够被附加到类声明,方法,访问符,属性或参数上。 装饰器使用expression这种形式,expression求值后必须为一个函数,它会在运行时被调用,被装饰的…

LoRA原理解析

文章目录 前言现有方案存在的问题Adapter TuningPrefix Tuning LoRA总结 前言 随着模型规模的不断扩大,微调模型的所有参数(所谓full fine-tuning)的可行性变得越来越低。以GPT-3的175B参数为例,每增加一个新领域就需要完整微调一…

界面组件DevExpress ASP.NET Core v23.1新版亮点 - 增强的数据可视化

DevExpress ASP.NET Core Controls使用强大的混合方法,结合现代企业Web开发工具所期望的所有功能。该套件通过ASP.NET Razor标记和服务器端ASP.NET Core Web API的生产力和简便性,提供客户端JavaScript的性能和灵活性。ThemeBuilder工具和集成的Material…

纯LiDAR Odometry——LinK3D论文详解

先说总结 总体思路是:针对输入来的点云,对每一个scan进行edge特征点的提取,因为提取的特征点因为噪声等原因导致特征点不鲁棒,所以又对特征点通过聚类的方法进行了特征增强,对增加后的特征投影到平面上,分别…

无线通信模块|wifi模块、BLE蓝牙模块、wifi蓝牙二合一模块科普介绍

物联网技术能够帮助智能家居环境中的门厅场景、客厅场景、厨房场景、卧室场景以及阳台场景的智能化管理。现如今智能家居和智能应用之间的配合离不开物联网模块的帮助。没有WiFi模块智能家居就不能很好的工作,甚至不能很好的进行数据的交换。现阶段的物联网智能家居…

程序员必须知道的加密、解密和签名算法

1. 对称加密 对称加密,加密和解密使用相同的秘钥,加密速度快、效率高。常见的有 DES(淘汰)、3DES(淘汰)、AES(用于替代 DES,是目前常用的)等。 加密解密 1.1. DES&#…

建造者模式:详解构造函数、set方法、建造者模式三种对象创建方式

思考: 为什么需要建造者模式 与工厂模式有何区别? 为什么需要建造者模式? 平时常常使用new关键字来创建对象,什么时候new对象时候不适用了呢?可能是创建对象时候可能是构造函数中传入太多的内容吧。 下面通过一个例子…

基于Java电脑硬件库存管理系统设计实现(源码+lw+部署文档+讲解等)

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

Linux下从CPU/内存/IO三个方面来分析系统性能

在实际生产环境中是否遇到如下问题? 系统平均负载过高。 CPU使用率过高。 硬盘利用率已经饱和,IO存在瓶颈。 首先明确一下进程的常见6种状态 R运行状态(running):并不意味着进程一定在运行中,它表明进程要…

钉钉聊天对话框和截图经常发生白屏

环境: 7.0.30-rel6019102 Win10专业版 L盾加密环境 问题描述: 钉钉聊天对话框和截图经常发生白屏 解决方案: 1.【电脑端钉钉】- 左上角【头像】-【设置】-【高级】- 下拉【网络检测】- 点击【开始检测】 如果变红说明网络有问题&#x…

redis安装后启动报redis-server.exe redis.windows.conf

文章目录 1. 报错的内容2. 解决方法:(亲测有效) 1. 报错的内容 redis安装后启动报redis-server.exe redis.windows.conf 完整报错如下: 2. 解决方法:(亲测有效) 先使用命令切换到redis安装目…

Redis常用命令操作

#linux是redis-cli #普通环境 redis-cli.exe -h host -p port -a password #集群环境,否则报:(error) MOVED 6918 127.0.0.1:6381 redis-cli.exe -c -h host -p port -a password#参数说明 #host:远程redis服务器host #port:远程r…

开发人员必备:9个令人惊叹的CSS网格生成器推荐!

微信搜索 【大迁世界】, 我会第一时间和你分享前端行业趋势,学习途径等等。 本文 GitHub https://github.com/qq449245884/xiaozhi 已收录,有一线大厂面试完整考点、资料以及我的系列文章。 快来免费体验ChatGpt plus版本的,我们出的钱 体验地…

【分布式应用】zabbix 二:自定义监控、自动发现与自动注册

目录 一、添加zabbix客户端主机1.1环境设置1.2配置zabbix-angent1.3在 Web 页面中添加 agent 主机 二 、自定义监控内容2.1客户端自定义key2.2在Web页面创建自定义监控模板 三、zabbix自动发现四、zabbix自动注册 一、添加zabbix客户端主机 1.1环境设置 systemctl disable --…

2490. 回环句

句子 是由单个空格分隔的一组单词,且不含前导或尾随空格。 例如,"Hello World"、"HELLO"、"hello world hello world" 都是符合要求的句子。 单词 仅 由大写和小写英文字母组成。且大写和小写字母会视作不同字符。 如果…

查询例题(三道)

一、 写法一: 写法二: 二、 1、内连接: 一个部门下有哪些人,找的相关联的数据 2、左外连接: 以部门表为基准,部门下面没有人,但是也会查询出来 3、右外连接: 以员工表为基准&#…

【Spring 丨数据绑定】

数据绑定 概述Databinder核心属性绑定参数绑定元数据绑定验证 概述 Spring 数据绑定(Data Binding)的作用是将用户的输入动态绑定到应用程序的领域模型JavaBean(或用于处理用户输入的任何对象)。 也就是说,Spring数据绑定机制是将属性值设置到目标对象中。如下图所示…

Bug小能手系列(python)_9: 使用sklearn库报错 module ‘numpy‘ has no attribute ‘int‘

AttributeError: module numpy has no attribute int. 0. 错误介绍1. 环境介绍2. 问题分析3. 解决方法3.1 调用解决3.2 库包中存在报错 4. 总结 首先,对于自己使用代码dtypenp.int报错的情况,建议直接修改为np.int_即可解决,也不用向下看了&a…

Python3安装教程在Unix/Linux操作系统

在Linux操作系统上安装Python3教程,先下载Python3安装包: Python3下载:https://www.python.org/downloads/source/ 选择适用于 Unix/Linux 的源码压缩包。下载及解压压缩包 Python-3.x.x.tgz,3.x.x 为你下载的对应版本号。如果你…

triton客户端使用

model_analyzer 简介: Triton Model Analyzer is a CLI tool which can help you find a more optimal configuration, on a given piece of hardware, for single, multiple, ensemble, or BLS models running on a Triton Inference Server. Model Analyzer wil…