【鸿蒙开发进阶】第13篇:数据持久化:Preferences 轻量存储与 RDB 数据库
·
📚 鸿蒙进阶专栏 · 第 13 篇 / 共 20 篇(进阶篇 11-20)
上一篇:状态管理进阶:@Provide/@Consume 与 AppStorage | 下一篇:Navigation 导航体系:替代 router 的现代方案
目录
数据持久化:Preferences 轻量存储与 RDB 数据库
数据持久化:Preferences 轻量存储与 RDB 数据库
做登录态、离线缓存、收藏列表,都需要数据持久化。鸿蒙提供了三种武器,这篇讲最常用的前两种并给出选型标准。

一、Preferences:存配置的最简方案
import { dataPreferences } from '@kit.ArkData'
const STORE = 'user_settings'
// 写入(异步)
async function saveToken(token: string) {
const p = await dataPreferences.getPreferences(getContext(), STORE)
await p.put('token', token)
await p.flush() // 必须 flush 才真正落盘!
}
// 读取
async function getToken(): Promise<string> {
const p = await dataPreferences.getPreferences(getContext(), STORE)
return (await p.get('token', '')) as string
}
⚠️ 新手最常犯:put 之后忘了 flush,重启发现数据没存上。flush() 才会写入磁盘。
二、RDB:鸿蒙自带的 SQLite
import { relationalStore } from '@kit.ArkData'
// 1. 获取数据库实例
const config: relationalStore.StoreConfig = {
name: 'app.db',
securityLevel: relationalStore.SecurityLevel.S1
}
const store = await relationalStore.getRdbStore(getContext(), config)
// 2. 建表(只建一次)
await store.executeSql(
`CREATE TABLE IF NOT EXISTS note (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
content TEXT,
created_at INTEGER
)`)
// 3. 插入
const bucket: relationalStore.ValuesBucket = {
'title': '第一篇笔记', 'content': 'Hello RDB',
'created_at': Date.now()
}
await store.insert('note', bucket)
// 4. 查询
const pred = new relationalStore.RdbPredicates('note')
pred.equalTo('title', '第一篇笔记').orderByDesc('created_at')
const rs = await store.query(pred)
while (rs.goToNextRow()) {
const title = rs.getString(rs.getColumnIndex('title'))
}
💡 RdbPredicates 是链式条件构造器,对应 SQL 的 where/order by,不用手拼 SQL 字符串,能防注入。
三、封装建议
别在页面里直接写 SQL。建一个 db/NoteDao.ets,把 insert/query/update/delete 封装成方法,页面只调用——这就是下一篇分层架构的雏形。
四、常见坑
| 坑 | 解法 |
|---|---|
| Preferences 忘 flush | 写完必调 flush() |
| 数据库句柄到处 new | 全局单例,onCreate 里初始化一次 |
| securityLevel 不设 | API 12+ 必须设置,否则报错 |
| 查询结果 rs 忘 close | 用完 rs.close() 释放 |
五、下一篇预告
入门篇用 router 跳页面,复杂应用为什么要换 Navigation?下一篇讲清楚。
进阶系列持续更新中,点赞 + 收藏 + 关注不迷路。
遇到问题评论区贴报错信息 + 关键代码,看到都会回。也欢迎留言点播你想看的进阶主题。
更多推荐




所有评论(0)