鸿蒙开发必备技能:六种数据存储方式全解析+实战代码

鸿蒙开发必备技能:六种数据存储方式全解析+实战代码_第1张图片

摘要

在当前多设备互联的时代,移动端应用不再局限于单一设备,而是需要在多个终端上保持状态一致、数据同步与持久管理。鸿蒙系统提供了多种数据存储机制,从轻量级状态存储到复杂的数据持久化方案,满足不同场景下的需求。本文将结合实战案例,深入讲解鸿蒙系统中的六大数据存储方式,并配有可运行的代码,帮助开发者快速掌握数据管理方法。

引言

随着鸿蒙系统的不断发展,越来越多的开发者开始构建面向多设备、多用户、多场景的智能应用。在这样的背景下,如何高效、灵活、安全地管理数据就变得尤为关键。鸿蒙系统主要提供了以下六种数据存储方式:

  • 三种 UI 状态存储方式:

    • 页面级 UI 状态:LocalStorage
    • 应用全局 UI 状态:AppStorage
    • 可持久化 UI 状态:PersistentStorage
  • 三种持久化数据存储方式:

    • 用户偏好: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)}`);
  }
}

应用场景分析与代码实践

场景一:实现“夜间模式”设置持久保存

  • 使用:PersistentStoragePreferences
  • 优点:下次启动仍保留上次选择
@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;需要长期保存用户设置,就用 PersistentStoragePreferences;如果数据结构更复杂,那就选择 KVStoreRelationalStore

通过这六种方式的合理组合,可以让你的鸿蒙应用具备强大的数据管理能力,也能带来更好的用户体验。

你可能感兴趣的:(harmonyos)