6、存储篇:鸿蒙本地存储与文件读写全掌握(附实操案例) 原创

wx5eb6c0016c3c7
发布于 2025-5-13 11:08
浏览
0收藏

在鸿蒙应用开发中,数据持久化是必不可少的。本文通过实战案例,全面讲解如何在 HarmonyOS 中使用本地存储和文件操作,助你掌握数据保存的核心技能!


🧠 一、鸿蒙常用存储方式简介

存储类型 适用场景 特点
Preferences (轻量存储) 保存少量配置信息,如用户设置、Token等 类似本地 key-value 存储
文件存储(FileIO) 保存图片、文档、大体积数据 支持二进制流和文本操作

📦 二、实战开发:记住我(保存登录状态)

需求:

  • 用户第一次登录后,保存登录信息
  • 下次打开自动读取并展示
  • 支持清除登录信息

🛠️ 三、轻量存储(Preferences)使用指南

1. 封装 StorageService

model/StorageService.ets 文件中:

import preferences from '@ohos.data.preferences';

let prefs: preferences.Preferences;

async function getPreferences() {
  if (!prefs) {
    prefs = await preferences.getPreferences(globalThis.getContext(), 'user_info');
  }
  return prefs;
}

export async function saveLoginInfo(username: string) {
  const store = await getPreferences();
  await store.put('username', username);
  await store.flush(); // 刷新保存
}

export async function getLoginInfo(): Promise<string> {
  const store = await getPreferences();
  return await store.get('username', '');
}

export async function clearLoginInfo() {
  const store = await getPreferences();
  await store.delete('username');
  await store.flush();
}

2. 创建登录页

pages/LoginPage.ets

import { saveLoginInfo, getLoginInfo, clearLoginInfo } from '../model/StorageService';

@Entry
@Component
struct LoginPage {
  @State username: string = ''
  @State savedUsername: string = ''

  async aboutToAppear() {
    this.savedUsername = await getLoginInfo();
  }

  build() {
    Column() {
      TextInput({ placeholder: '请输入用户名' })
        .onChange(v => this.username = v)
        .margin({ bottom: 20 })

      Button('登录').onClick(async () => {
        if (this.username) {
          await saveLoginInfo(this.username);
          this.savedUsername = this.username;
        }
      }).margin({ bottom: 20 })

      Button('清除登录信息').onClick(async () => {
        await clearLoginInfo();
        this.savedUsername = '';
      })

      if (this.savedUsername) {
        Text(`欢迎回来,${this.savedUsername}!`).fontSize(20).margin({ top: 30 })
      }
    }
    .padding(20)
    .alignItems(HorizontalAlign.Center)
  }
}

🗂️ 五、进阶:文件读写操作(FileIO)

如果需要保存复杂数据或文件,比如图片/大文本,可以使用 FileIO 模块。

简单示例:

import fileio from '@ohos.fileio';

async function writeFile(filePath: string, content: string) {
  const fd = await fileio.open(filePath, fileio.OpenMode.CREATE | fileio.OpenMode.WRONLY);
  await fileio.write(fd, content);
  await fileio.close(fd);
}

async function readFile(filePath: string): Promise<string> {
  const fd = await fileio.open(filePath, fileio.OpenMode.READ_ONLY);
  const buffer = new ArrayBuffer(1024);
  await fileio.read(fd, buffer);
  await fileio.close(fd);
  return String.fromCharCode.apply(null, new Uint8Array(buffer));
}
  • 写文件:保存文本、日志、缓存内容。
  • 读文件:读取本地文件内容,如离线数据处理。

💬 六、常见问题排查

问题 解决方案
无法保存数据 确认权限(例如读取/写入权限)
Preferences 报错 确保异步调用正确,使用 await
文件路径异常 使用 getContext().filesDir 获取安全路径

📘 七、总结

通过本篇实操,你掌握了鸿蒙中的两种常用本地存储方式:

  • ✅ 小数据用 Preferences
  • ✅ 大文件用 FileIO

掌握这两套能力,90%以上的应用存储需求你都能轻松搞定!


📖 下篇预告

《打造鸿蒙原生日历组件:自定义UI + 数据交互》——带你做一个高颜值、可切换月份的鸿蒙日历控件!


©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
标签
收藏
回复
举报
回复
    相关推荐