为什么到现在还有人分不清鸿蒙的数据持久化该怎么选?
每次写 HarmonyOS 应用做到“得存点东西”这一步,总有种“选数据持久化方案就像选对象”般的纠结:存太简单吧怕不够用,存太复杂吧又怕自己后悔。更骚的是,鸿蒙官方一口气给了好几种方案,每个名字都特别“它能干点啥但又不告诉你能干啥”的那种。所以今天,就让我带着点“开发者深夜加班的抱怨式热情”,把整个鸿蒙的数据持久化体系从上到下掰开揉碎讲清楚。你会看到代码、看到实战、看到性能分析,还能顺便知道到底
大家好,我是[晚风依旧似温柔],新人一枚,欢迎大家关注~
本文目录:
前言
每次写 HarmonyOS 应用做到“得存点东西”这一步,总有种“选数据持久化方案就像选对象”般的纠结:
存太简单吧怕不够用,存太复杂吧又怕自己后悔。
更骚的是,鸿蒙官方一口气给了好几种方案,每个名字都特别“它能干点啥但又不告诉你能干啥”的那种。
所以今天,就让我带着点“开发者深夜加班的抱怨式热情”,把整个鸿蒙的数据持久化体系从上到下掰开揉碎讲清楚。你会看到代码、看到实战、看到性能分析,还能顺便知道到底哪个方案适合你(以及哪个堪比研发陷阱)。
准备好了么?那我们开整!
🧩 1. Preferences:轻量得像个记事本,它要是复杂我都怀疑人生
先从最简单的说起 —— Preferences。
这东西就像你家冰箱门上的便签纸:能写点儿轻松小记,但你要存图片、存对象、存结构化数据,它立马罢工。
适用场景
- 存一些轻量化 KV:例如登录状态、用户设置、布尔开关
- 数据量不大、结构不复杂
- 不追求高级查询和关系结构
我对它的真实评价
“简单好用,但别想着让它承担你和产品经理两个人的梦想。”
使用示例
import dataPreferences from '@ohos.data.preferences';
async function saveUserConfig() {
const prefs = await dataPreferences.getPreferences(getContext(), 'userConfig');
await prefs.put('darkMode', true);
await prefs.flush();
}
async function loadUserConfig() {
const prefs = await dataPreferences.getPreferences(getContext(), 'userConfig');
const dark = await prefs.get('darkMode', false);
console.log('DarkMode:', dark);
}
用法简单到离谱,但它就是个 能读能写的小本子,别想太多。
📁 2. Data Storage(文件存储):野路子最强,但别太野
文件存储一直是全栈开发心里最“稳”的 fallback:只要能写文件,一切皆可存。
但鸿蒙里的 Data Storage 并不是你想的那种随便来,而是一个稍微“规矩”的文件系统 API。
适用场景
- 保存配置类 JSON
- 保存大块内容(图片、日志、缓存)
- 想自由决定数据结构
我对它的真实评价
“它自由,但自由的代价就是,你TM什么都得自己处理。”
代码示例
import fs from '@ohos.file.fs';
async function saveJson() {
const path = `/data/storage/el2/base/haps/test.json`;
const file = fs.openSync(path, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
fs.writeSync(file, JSON.stringify({ name: "HarmonyDev", age: 18 }));
fs.closeSync(file);
}
async function readJson() {
const path = `/data/storage/el2/base/haps/test.json`;
const file = fs.openSync(path, fs.OpenMode.READ_WRITE);
const content = fs.readSync(file).toString();
console.log(JSON.parse(content));
fs.closeSync(file);
}
优势与劣势
- ✔ 灵活、无上限
- ✔ 更适合大文件
- ✘ 没有事务
- ✘ 没有自动结构化
- ✘ 全靠你自己管理
🗃 3. RDB(关系数据库):当你想要“正儿八经干活”时就选它
要是你的数据一多、有结构、需要查询排序筛选分页……那你一定得升级到 RDB。
鸿蒙的 RDB 本质就是 SQLite 的包装。
写得你一个熟练 MySQL 的人也能立刻上手。
使用场景
- 数据结构化
- 多字段查询
- 需要事务
- 表之间有关系
- 数据量大
个人吐槽式评价
“你要是项目中后期还用 Preferences 存业务数据,你自己不会崩溃,但是未来接手你代码的人会。”
基本使用示例
import relationalStore from '@ohos.data.relationalStore';
const STORE_CONFIG = {
name: 'app.db',
securityLevel: relationalStore.SecurityLevel.S1
};
// 创建数据库 & 创建表
async function initDB() {
const store = await relationalStore.getRdbStore(getContext(), STORE_CONFIG);
await store.executeSql(`
CREATE TABLE IF NOT EXISTS user(
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
age INTEGER
);
`);
}
// 插入
async function insertUser(name: string, age: number) {
const store = await relationalStore.getRdbStore(getContext(), STORE_CONFIG);
await store.insert('user', { name, age });
}
// 查询
async function queryUser() {
const store = await relationalStore.getRdbStore(getContext(), STORE_CONFIG);
const resultSet = await store.querySql("SELECT * FROM user WHERE age > 10");
while (resultSet.goToNextRow()) {
console.log("User:", resultSet.getString(1));
}
resultSet.close();
}
RDB 是你能明显感觉到稳定、安全、成熟的那种方案。
🌐 4. 分布式数据库:当你的数据要“自带超能力”
一旦你觉得你的 app 在多个设备上同步数据是理所当然(比如手机 + 平板 + 手表),那分布式数据库就成了你的秘密武器。
这是 HarmonyOS 的“必杀技”之一:
多设备协同下的数据自动同步。
适用场景
- 多设备协同
- 多端数据一致性
- 小量数据同步
- 自动处理分布式拓扑
我的真实评价
“牛逼是真的牛逼,但别对性能幻想太多,它不是拿来做千万级数据仓库的。”
分布式数据库示例
import distributedData from '@ohos.data.distributedData';
async function writeDistributed() {
const kvManager = distributedData.createKVManager({
context: getContext(),
config: { bundleName: "com.demo.app" }
});
const store = await kvManager.getKVStore("distStore", {
type: distributedData.KVStoreType.SINGLE_VERSION
});
await store.put("nickName", "HarmonyDeveloper");
}
async function readDistributed() {
const kvManager = distributedData.createKVManager({
context: getContext(),
config: { bundleName: "com.demo.app" }
});
const store = await kvManager.getKVStore("distStore", {
type: distributedData.KVStoreType.SINGLE_VERSION
});
const value = await store.get("nickName");
console.log("Distributed nick:", value);
}
🥊 5. 四大持久化方案对比(让数据自己说话)
| 能力 | Preferences | File Storage | RDB | 分布式数据库 |
|---|---|---|---|---|
| 数据类型 | 简单 KV | 任意文件 | 结构化表 | KV |
| 支持查询 | ❌ | ❌ | ✔ 强 | ❌ |
| 事务 | ❌ | ❌ | ✔ | 部分场景 |
| 适合数据量 | 小 | 中/大 | 中/大 | 小 |
| 多设备同步 | ❌ | ❌ | ❌ | ✔ 自动 |
| 性能 | 快 | 中等 | 中等偏高 | 中等偏低 |
| 开发复杂度 | 低 | 中 | 中 | 中 |
一句话总结:
- Preferences:能不用就不用,用就别多用。
- File Storage:自由但危险,适合大文件。
- RDB:正统数据库,需要它的时候你会知道。
- 分布式数据库:多设备协同的核武器。
🚀 6. 实战:按场景选方案(给你最实用的决策指南)
① 做一个普通 APP 的设置页?
➡ Preferences
你不会考虑别的。
② 要存一堆用户资料、订单、日志?
➡ RDB
这就是它的战场。
③ 要存 500MB 缓存图片?
➡ 文件
谁都替不了它。
④ 手机 + 平板 + 手表数据同步?
➡ 分布式数据库
这是 HarmonyOS 的专长。
⑤ 做即时通讯聊天记录?
➡ RDB + 分布式数据库(部分状态同步)
两者搭配!
⚡ 7. 性能分析(来自开发者的血泪经验)
| 操作 | 最快 | 最慢 | 原因 |
|---|---|---|---|
| 单 KV 读写 | Preferences | 分布式 | 网络同步会拖慢 |
| 大文件写入 | File Storage | 分布式 | 分布式不干这个 |
| 批量数据存储 | RDB | Preferences | RDB 有事务优化 |
| 查询多条件 | RDB | 其他三种 | 本来就是数据库 |
| 多设备一致性 | 分布式 | 其他三种 | 唯一有同步能力 |
🎯 结语:选数据方案就像谈恋爱,合适最重要
写到这里,你是不是突然开悟:
原来鸿蒙的数据持久化不是“哪个最强”,而是“哪个最适合我现在的需求”。
毕竟你不会在深夜饿得半死的时候去点法式晚餐,也不会为了存一条布尔值去硬上 RDB(那多半是闲的)。
希望这篇文章能让你在选择数据持久化时不再卡壳、犹豫、抓耳挠腮。
让我们一起在鸿蒙的世界里,把数据存得漂亮,写得更漂亮。✨
如果觉得有帮助,别忘了点个赞+关注支持一下~
喜欢记得关注,别让好内容被埋没~
更多推荐



所有评论(0)