📚 鸿蒙进阶专栏 · 第 13 篇 / 共 20 篇(进阶篇 11-20)
上一篇:状态管理进阶:@Provide/@Consume 与 AppStorage | 下一篇:Navigation 导航体系:替代 router 的现代方案

目录

数据持久化:Preferences 轻量存储与 RDB 数据库

一、Preferences:存配置的最简方案

二、RDB:鸿蒙自带的 SQLite

三、封装建议

四、常见坑

五、下一篇预告


数据持久化: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?下一篇讲清楚。


进阶系列持续更新中,点赞 + 收藏 + 关注不迷路。
遇到问题评论区贴报错信息 + 关键代码,看到都会回。也欢迎留言点播你想看的进阶主题。

Logo

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

更多推荐