大家好,我是[晚风依旧似温柔],新人一枚,欢迎大家关注~

前言

每次写 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(那多半是闲的)。

希望这篇文章能让你在选择数据持久化时不再卡壳、犹豫、抓耳挠腮。
让我们一起在鸿蒙的世界里,把数据存得漂亮,写得更漂亮。✨

如果觉得有帮助,别忘了点个赞+关注支持一下~
喜欢记得关注,别让好内容被埋没~

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐