HarmonyOS鸿蒙Next中如何在应用中实现高效的数据持久化存储?Preferences与Database的使用场景如何区分?
HarmonyOS鸿蒙Next中如何在应用中实现高效的数据持久化存储?Preferences与Database的使用场景如何区分?
- 官网有过一定的差异介绍,总的来说少量数据用首选项,批量数据用数据库
参考文档:PersistentStorage、Preferences、键值型数据库、关系型数据库的区别及适用场景-行业常见问题-便捷生活类行业实践-行业实践 - 华为HarmonyOS开发者
- PersistentStorage:持久化存储UI状态,通常和AppStorage配合使用,选择AppStorage存储的数据写入磁盘,以确保这些属性在应用程序重新启动时的值与应用程序关闭时的值相同。应用数据持久化:是指应用将内存中的数据通过文件或数据库的形式保存到设备上。内存中的数据形态通常是任意的数据结构或数据对象,存储介质上的数据形态可能是文本、数据库、二进制文件等。HarmonyOS标准系统支持典型的存储数据形态,包括用户首选项(Preferences)、键值型数据库(KV-Store)、关系型数据库(RelationalStore)。
PersistentStorage | 用户首选项(Preferences) | 键值型数据库(KV-Store) | 关系型数据库(RelationalStore) | |
---|---|---|---|---|
介绍 | PersistentStorage持久化存储UI状态,通常和AppStorage配合使用,选择AppStorage存储的数据写入磁盘,以确保这些属性在应用程序重新启动时的值与应用程序关闭时的值相同。 | Preferences是用于存储应用程序设置的轻量级数据库。它提供了一种简单的机制来存储和检索应用程序的配置信息,数据通常以键值对的形式存储。Preferences的数据是同步存储的,适用于存储少量的结构化数据。 | 一种非关系型数据库,其数据以“键值”对的形式进行组织、索引和存储,其中“键”作为唯一标识符。 | 关系型数据库基于SQLite组件,适用于存储包含复杂关系数据的场景。 |
适用场景 | 1. 需要持久化存储UI状态的应用程序。 2. 需要在UI实例初始化后进行持久化操作。 3. 希望在应用程序关闭后重新启动时恢复上次的状态。 |
1. 需要存储应用程序的配置信息。 2. 需要支持数据的快速读取和写入。 3. 希望在应用程序的不同部分共享数据。 4. 应用保存用户的个性化设置(字体大小,是否开启夜间模式)。 |
存储的数据没有复杂的关系模型,比如存储商品名称及对应价格、员工工号及今日是否已出勤等。 | 数据之间有较强的对应关系场景,比如一个班级的学生信息,需要包括姓名、学号、各科成绩等;公司的雇员信息,需要包括姓名、工号、职位等。 |
是否支持加密 | 不涉及。 | 不支持。 | 支持,参考数据库加密文档。 | 支持,参考数据库加密文档。 |
限制条件 | 1. 不支持嵌套对象(对象数组,对象的属性是对象等)。 2. PersistentStorage适用于存储<2KB的轻量数据,其同步写入磁盘机制会影响UI线程性能。需存储大量数据时,应改用数据库API以避免界面渲染卡顿。 更多详细参考官方文档。 |
1. 首选项无法保证多进程并发安全,易导致数据损坏,不支持多进程使用。 2. Key键为string类型,非空且长度≤1024字节。 3. 字符串类型的Value使用UTF-8编码,可为空,非空时长度不超过16MB。 4. 内存随数据量增加而增长,建议存储≤50MB轻量数据,大数据的同步持久化操作易引发主线程卡顿,可能出现appfreeze问题。 更多详细参考官方文档。 |
1. 设备协同数据库,针对每条记录,Key的长度≤896 Byte,Value的长度<4 MB。 2. 单版本数据库,针对每条记录,Key的长度≤1 KB,Value的长度<4 MB。 3. 每个应用程序最多支持同时打开16个键值型分布式数据库。 4. 键值型数据库事件回调方法中不允许进行阻塞操作,例如修改UI组件。 更多详细参考官方文档。 |
1. 为保证数据的准确性,数据库同一时间只能支持一个写操作。 2. 为保证插入并读取数据成功,建议一条数据不要超过2M。超出该大小,插入成功,读取失败。 3. 当应用被卸载完成后,设备上的相关数据库文件及临时文件会被自动清除。 更多详细参考官方文档 。 |
更多关于HarmonyOS鸿蒙Next中如何在应用中实现高效的数据持久化存储?Preferences与Database的使用场景如何区分?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
用户首选项(Preferences)
适用场景:
1/轻量级配置存储:存储用户个性化设置;保存简单键值对;数据量建议不超过1万条,单条数据≤8KB
2/高频访问需求:数据缓存在内存中,访问速度极快;通过flush()方法手动持久化到磁盘
示例:
import { preferences } from '@kit.ArkData';
// 初始化首选项实例
let pref: preferences.Preferences = await preferences.getPreferences(context, 'MyAppSettings');
// 存储夜间模式状态
await pref.put('darkMode', true);
await pref.flush(); // 手动触发持久化
// 读取数据
let isDarkMode: boolean = await pref.get('darkMode', false);
**限制:**不支持多进程并发操作;不适用于分布式同步场景(仅本地存储)
关系型数据库(RelationalStore)
适用场景:
1/结构化数据管理:存储复杂业务数据;支持SQL查询、事务操作和表关联
2/大数据量场景:单条数据可超过1MB(最大支持16MB);通过索引优化查询性能
示例:
import { relationalStore } from '@kit.ArkData';
// 定义表结构
const SQL_CREATE_TABLE = 'CREATE TABLE IF NOT EXISTS User (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)';
// 初始化数据库
let rdbStore = await relationalStore.getRdbStore(context, { name: 'UserDB' });
await rdbStore.executeSql(SQL_CREATE_TABLE);
// 插入数据
const value = { id: 1, name: '张三', age: 28 };
await rdbStore.insert('User', value);
**优势:**支持多线程事务;可通过BackupExtensionAbility实现跨设备数据迁移
HarmonyOS Next中数据持久化存储主要通过Preferences和RDB实现。Preferences适用于轻量级键值对数据存储,如应用配置、用户设置等场景,采用非关系型存储方式。Database(RDB)适用于结构化数据存储,支持复杂查询和事务操作,适合存储大量关联数据。两者区别在于:Preferences操作更轻量,无需SQL;RDB提供完整关系型数据库能力,支持多表关联和复杂业务逻辑。
在HarmonyOS Next中,数据持久化存储可以通过Preferences和Database两种方式实现,具体使用场景如下:
Preferences
适用于存储轻量级、结构简单的键值对数据,如用户设置、应用配置等。
- 基于键值对存储,读写效率高,适合频繁访问的小数据量场景。
- 数据以XML格式存储,不支持复杂查询或事务操作。
- 示例:保存用户主题偏好、登录状态等。
Database
适用于存储结构化、数据量较大或需要复杂查询的场景,如用户信息、交易记录等。
- 基于关系型数据库(如SQLite),支持SQL语法、事务处理和复杂查询。
- 适合需要数据关联、聚合或条件筛选的场景。
- 示例:用户订单管理、消息历史记录存储。
选择建议
- 若数据量小、结构简单且无需复杂操作,优先使用Preferences。
- 若数据需关联查询、事务支持或结构复杂,则选择Database。
两者均通过HarmonyOS SDK提供API,可根据实际需求灵活选用。