数据持久化的方式有哪些?

数据持久化的方式

HarmonyOS
2024-05-22 23:16:47
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
leeixndong

持久化是将内存中的对象或者数据存在

数据库或者保存为

文件

  • AppStorage + PersistentStorage(应用全局的UI状态存储)
  •  Preferences(用户首选项-键值型)
  •  KVStore(键值型数据库)
  • RdbStore(关系型数据库)
  • fs(写文件)

讨论:支持存储的

数据格式

持久化文件类型和路径、使用的

场景

当前仅针对应用本身,不涉及应用分享和分布式。

AppStorage + PersistentStorage

AppStorage

AppStorage可以和UI组件同步,属性支持双向绑定,数据支持本地或者远程。

(当前文章不涉及分布式的场景)

  • 应用级的全局状态共享
  • 进程内单例,API都是静态的

对比

LocalStorage

  •  UIAbility内,页面间共享状态
  •  非单例
  • 不支持持久化

路径无法通过context获取,且文件有多份,多文件不会同步。

这里有个问题:文件并不代表最新的值

例子:

1. entry创建aProp的值为47

2. application修改aProp的值为52

3. 查看entry下persistent_storage文件中aProp值未改变,依然是47;但是application下persistent_storage文件中aProp值已改变。

4. entry中通过接口获取aProp值与application中通过接口获取aProp值一致,都为52。

/data/app/el2/100/base/com.example.filedemo/

haps/entry/files/persistent_storage

**存储文件:**XML文件

/data/app/el2/100/base/com.example.filedemo/haps/entry/files/persistent_storage

使用限制:

当持久化更改的过程变得太繁重时,PersistentStorage实现可能会限制持久化属性更改的频率。

  • 避免持久化大型数据集。
  • 避免持久化经常变化的变量。

没有给出数据大小限制的具体指标。

Preferences(用户首选项-键值型)

使用场景:应用配置类,单条数据量较小(小于8K),数据量不超过1W条。

支持类型: number、string、boolean、Array、Array、Array类型。

应用级路径(ApplicationContext获取 沙箱路径):

​<路径前缀>/<加密等级>/base/preferences

HAP级路径(AbilityStageContext、UIAbilityContext、ExtensionContext):

<路径前缀>/<加密等级>/base/haps/<module-name>/preferences

  • ps -ef | grep bundleName // 通过 ps 命令找到对应应用的 pid
  • nsenter -t hapPid -m /bin/sh // 通过 nsenter 命令指定上一步搜出来的 pid 进入进程的命名空间。

**存储文件:**XML文件

物理路径:/data/app/el2/100/base/com.example.filedemo/haps/entry/preferences/test

number都是按double存储,保留小数点6位。所以数字存储有精度问题,使用过程中需要考虑。

使用限制:

  • Key键为string类型,非空且长度不超过80个字节。
  •  如果Value值为string类型,请使用UTF-8编码格式,可以为空,不为空时长度不超过8192个字节。
  •  建议存储的数据不超过一万条。

KVStore(键值型数据库)

distributedKVStore:分布式键值数据库为应用程序提供

不同设备间数据库的分布式协同能力。

  • SingleKVStore    单版本分布式键值数据库,不对数据所属设备进行区分,提供查询数据和同步数据的方法。
  • DeviceKVStore    设备协同数据库,继承自SingleKVStore,以设备维度对数据进行区分,提供查询和同步数据的方法。

场景:

  • 单机场景,数据需要加密。
  • 分布式场景。

**支持类型:**Uint8Array | string | number | boolean

**存储文件:**db文件 + key文件(加密)

SingleKVStore文件路径:

物理路径:

abilityContext /data/app/el2/100/database/com.example.filedemo/entry/kvdb/9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08/single_ver/main

appContext /data/app/el2/100/database/com.example.filedemo/kvdb/9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08/single_ver/main

# 目录树 
mian 
 - key 
        xx.key  
 - kvdb 
        xx.db 
        xx.db-shm 
        xx.db-wal

底层也是用的

SQLite

使用SQLite客户端打开,可以看到加密数据。

使用限制:

  • 设备协同数据库,针对每条记录,Key的长度≤896 Byte,Value的长度<4 MB。
  • 单版本数据库,针对每条记录,Key的长度≤1 KB,Value的长度<4    MB。
  • 每个应用程序最多支持同时打开16个键值型分布式数据库。
  • 键值型数据库事件回调方法中不允许进行阻塞操作,例如修改UI组件。
  • 所有需要获取deviceId的接口,都

仅系统应用可用

RdbStore(关系型数据库)

底层使用

SQLite作为持久化存储引擎,支持SQLite具有的数据库特性,包括但不限于事务、索引、视图、触发器、外键、参数化查询和预编译SQL语句。

  • 0 配置,无服务器
  • 轻量级
  • 支持 SQL92(SQL2)标准的大多数查询语言的功能

场景:业务数据的存储,特别是需要频繁查询的数据。

支持:SQLite 数据类型 | 菜鸟教程 (runoob.com)

使用限制:

  • 系统默认日志方式是WAL(Write Ahead Log)模式,系统默认落盘方式是FULL模式。
  • 数据库中连接池的最大数量是4个,用以管理用户的读操作。
  • 为保证数据的准确性,数据库同一时间只能支持一个写操作。
  • 当应用被卸载完成后,设备上的相关数据库文件及临时文件会被自动清除。

WAL模式:每次操作生成

一个命令

追加写入一个日志中。可用于数据恢复。

fs(写文件)

场景:文件自定义。

小结

  • 同样是以键值对形式的进行存储,支持的数据量上来看,KVStore    > Preferences
分享
微博
QQ
微信
回复
2024-05-23 18:11:40
相关问题
关于数据持久存储要如何实现
96浏览 • 2回复 待解决
卡片开发中如何实现数据持久
894浏览 • 1回复 待解决
如何实现应用数据持久存储
855浏览 • 1回复 待解决
求大佬告知如何实现数据持久
62浏览 • 1回复 待解决
哪些创建线程方式
1074浏览 • 1回复 待解决
如何在IDE每次run项目后数据持久
515浏览 • 1回复 待解决
ArkTS实现时钟方式哪些
436浏览 • 1回复 待解决
获取MainAbility name方式哪些呢?
795浏览 • 1回复 待解决
网络请求创建后,持久问题
274浏览 • 1回复 待解决
http 请求 如何cookie持久?
793浏览 • 1回复 待解决
redis config 持久怎么设置?
2733浏览 • 1回复 待解决
PersistentStorage如何持久一个对象?
1405浏览 • 1回复 待解决
OceanBase数据特点哪些
3309浏览 • 1回复 待解决
OceanBase 数据部署过程哪些
2095浏览 • 1回复 待解决
推理函数支持数据格式哪些
915浏览 • 1回复 待解决