摘要
在当前多设备互联的时代,移动端应用不再局限于单一设备,而是需要在多个终端上保持状态一致、数据同步与持久管理。鸿蒙系统提供了多种数据存储机制,从轻量级状态存储到复杂的数据持久化方案,满足不同场景下的需求。本文将结合实战案例,深入讲解鸿蒙系统中的六大数据存储方式,并配有可运行的代码,帮助开发者快速掌握数据管理方法。
引言
随着鸿蒙系统的不断发展,越来越多的开发者开始构建面向多设备、多用户、多场景的智能应用。在这样的背景下,如何高效、灵活、安全地管理数据就变得尤为关键。鸿蒙系统主要提供了以下六种数据存储方式:
三种 UI 状态存储方式:
- 页面级 UI 状态:
LocalStorage
- 应用全局 UI 状态:
AppStorage
- 可持久化 UI 状态:
PersistentStorage
- 页面级 UI 状态:
三种持久化数据存储方式:
- 用户偏好:
Preferences
- 键值型数据库:
KVStore
- 关系型数据库:
RelationalStore
- 用户偏好:
接下来我们将分模块进行解析与实践。
UI 状态存储方案
页面级状态存储(LocalStorage)
这种方式就像你在当前页面上开了个“备忘录”,页面销毁后数据也会消失,适合暂存一些临时状态。
示例代码:
// 在 .ets 页面中使用
@Entry
@Component
struct MyPage {
@LocalStorage('tempCounter') tempCounter: number = 0;
build() {
Column() {
Text(`计数器:${this.tempCounter}`)
Button('增加').onClick(() => {
this.tempCounter += 1;
})
}
}
}
全局状态存储(AppStorage)
这个就相当于你在整个 App 里放了一个全局变量,页面之间可以共享,适合全局状态共享的场景,比如登录状态。
示例代码:
@Entry
@Component
struct HomePage {
@AppStorage('isLoggedIn') isLoggedIn: boolean = false;
build() {
Column() {
Text(this.isLoggedIn ? '已登录' : '未登录')
Button(this.isLoggedIn ? '退出' : '登录').onClick(() => {
this.isLoggedIn = !this.isLoggedIn;
})
}
}
}
可持久化 UI 状态存储(PersistentStorage)
除了在页面之间共享,它还能在 App 重启后保留状态,很适合存用户设置。
示例代码:
@Entry
@Component
struct SettingsPage {
@PersistentStorage('volume') volume: number = 50;
build() {
Column() {
Text(`音量:${this.volume}`)
Slider({ value: this.volume, min: 0, max: 100 })
.onChange(val => this.volume = val)
}
}
}
持久化数据管理方案
用户偏好(Preferences)
类似于 Android 中的 SharedPreferences,用来存储简单的用户设置或者行为记录。
示例代码:
import preferences from '@ohos.data.preferences';
async function saveUserTheme() {
let prefs = await preferences.getPreferences('user_prefs');
await prefs.put('theme', 'dark');
await prefs.flush(); // 确保写入磁盘
}
async function getUserTheme() {
let prefs = await preferences.getPreferences('user_prefs');
let theme = await prefs.get('theme', 'light'); // 默认 light
console.log(`当前主题:${theme}`);
}
键值数据库(KVStore)
适合需要快速读写、并且结构简单的数据,比如消息记录缓存、设备设置等。
示例代码:
import distributedKVStore from '@ohos.data.distributedKVStore';
let kvManager;
let kvStore;
async function initKVStore() {
kvManager = distributedKVStore.createKVManager({
bundleName: 'com.example.app',
context: getContext(this)
});
kvStore = await kvManager.getKVStore('appData');
await kvStore.put('userToken', 'abc123token');
}
async function getToken() {
let token = await kvStore.get('userToken');
console.log(`Token:${token}`);
}
关系型数据库(RelationalStore)
如果你需要管理结构化的数据,例如用户信息表、订单表,这种方式是首选,支持 SQL 查询。
示例代码:
import relationalStore from '@ohos.data.relationalStore';
async function initDB() {
let context = getContext(this);
const db = await relationalStore.getRdbStore(context, {
name: 'user.db',
version: 1,
tables: [
{ name: 'users', columns: ['id INTEGER PRIMARY KEY', 'name TEXT', 'age INTEGER'] }
]
});
await db.executeSql('INSERT INTO users (name, age) VALUES (?, ?)', ['张三', 22]);
let resultSet = await db.querySql('SELECT * FROM users');
while (resultSet.goToNextRow()) {
console.log(`用户:${resultSet.getString(1)},年龄:${resultSet.getLong(2)}`);
}
}
应用场景分析与代码实践
场景一:实现“夜间模式”设置持久保存
- 使用:
PersistentStorage
或Preferences
- 优点:下次启动仍保留上次选择
@PersistentStorage('darkMode') darkMode: boolean = false;
配合 Preferences:
await prefs.put('darkMode', true);
场景二:跨页面共享登录状态
- 使用:
AppStorage
@AppStorage('loginStatus') loginStatus: boolean = false;
场景三:用户历史订单查询(多字段存储)
- 使用:
RelationalStore
CREATE TABLE orders (id INTEGER PRIMARY KEY, user_id INTEGER, item TEXT, price REAL)
可以用 SQL 查询某个用户的历史记录。
QA 环节
Q1:UI 状态存储和 Preferences 的区别是什么?
- UI 状态更偏向页面绑定,用于界面交互;
- Preferences 适合后端逻辑或者非 UI 相关的用户行为保存。
Q2:KVStore 和 RelationalStore 有啥区别?
- KVStore 类似于 Map,结构简单但不支持复杂查询;
- RelationalStore 支持 SQL,适合多字段、大数据量的情况。
Q3:PersistentStorage 和 Preferences 有什么不同?
- PersistentStorage 主要用于 UI 的状态绑定;
- Preferences 更灵活,可以存任何键值对。
总结
在鸿蒙系统中实现数据存储并不复杂,关键是要根据不同场景选择合适的存储方式。如果只是临时数据,用 LocalStorage
;如果是跨页面状态,用 AppStorage
;需要长期保存用户设置,就用 PersistentStorage
或 Preferences
;如果数据结构更复杂,那就选择 KVStore
或 RelationalStore
。
通过这六种方式的合理组合,可以让你的鸿蒙应用具备强大的数据管理能力,也能带来更好的用户体验。