HarmonyOS鸿蒙Next中如何在应用中实现数据备份与恢复?

HarmonyOS鸿蒙Next中如何在应用中实现数据备份与恢复? 数据备份与恢复是应用的重要功能,本文介绍如何将应用数据导出为 JSON、实现备份文件生成、以及从备份文件恢复数据的完整流程。

4 回复

可以参考这个帖子:https://developer.huawei.com/consumer/cn/forum/topic/0202202005856127136?fid=0109140870620153026

分享了完整的实现方案。
StorageManager:

import { preferences } from '@kit.ArkData'
import { common } from '@kit.AbilityKit'

export class StorageManager {
  private static instance: StorageManager
  private preferences: preferences.Preferences | null = null
  private context: common.UIAbilityContext | null = null
  private readonly STORE_NAME: string = 'math_calculator_store'

  private constructor() {
  }

  static getInstance(): StorageManager {
    if (!StorageManager.instance) {
      StorageManager.instance = new StorageManager()
    }
    return StorageManager.instance
  }

  async init(context: common.UIAbilityContext): Promise<boolean> {
    try {
      this.context = context
      this.preferences = await preferences.getPreferences(context, this.STORE_NAME)
      return true
    } catch (error) {
      console.error(`Storage init failed: ${JSON.stringify(error)}`)
      return false
    }
  }

  async setString(key: string, value: string): Promise<StorageResult<void>> {
    if (!this.preferences) {
      return { success: false, errorMsg: '存储未初始化' }
    }
    try {
      await this.preferences.put(key, value)
      await this.preferences.flush()
      return { success: true }
    } catch (error) {
      return { success: false, errorMsg: `存储失败: ${JSON.stringify(error)}` }
    }
  }

  async getString(key: string, defaultValue: string = ''): Promise<StorageResult<string>> {
    if (!this.preferences) {
      return { success: false, errorMsg: '存储未初始化' }
    }
    try {
      const value = await this.preferences.get(key, defaultValue) as string
      return { success: true, data: value }
    } catch (error) {
      return { success: false, errorMsg: `读取失败: ${JSON.stringify(error)}` }
    }
  }

  async setObject<T>(key: string, value: T): Promise<StorageResult<void>> {
    try {
      const jsonString: string = JSON.stringify(value)
      return await this.setString(key, jsonString)
    } catch (error) {
      return { success: false, errorMsg: `序列化失败: ${JSON.stringify(error)}` }
    }
  }

  async getObject<T>(key: string, defaultValue: T): Promise<StorageResult<T>> {
    try {
      const result = await this.getString(key, '')
      if (!result.success || !result.data) {
        return { success: true, data: defaultValue }
      }
      const parsed: T = JSON.parse(result.data)
      return { success: true, data: parsed }
    } catch (error) {
      return { success: false, errorMsg: `反序列化失败: ${JSON.stringify(error)}` }
    }
  }

  async remove(key: string): Promise<StorageResult<void>> {
    if (!this.preferences) {
      return { success: false, errorMsg: '存储未初始化' }
    }
    try {
      await this.preferences.delete(key)
      await this.preferences.flush()
      return { success: true }
    } catch (error) {
      return { success: false, errorMsg: `删除失败: ${JSON.stringify(error)}` }
    }
  }

  async has(key: string): Promise<boolean> {
    if (!this.preferences) {
      return false
    }
    try {
      return await this.preferences.has(key)
    } catch (error) {
      return false
    }
  }

  async clear(): Promise<StorageResult<void>> {
    if (!this.preferences) {
      return { success: false, errorMsg: '存储未初始化' }
    }
    try {
      await this.preferences.clear()
      await this.preferences.flush()
      return { success: true }
    } catch (error) {
      return { success: false, errorMsg: `清空失败: ${JSON.stringify(error)}` }
    }
  }
}

// 存储结果接口
interface StorageResult<T> {
  success: boolean
  data?: T
  errorMsg?: string
}

更多关于HarmonyOS鸿蒙Next中如何在应用中实现数据备份与恢复?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


静等楼主分享

在HarmonyOS Next中,应用数据备份与恢复通过ArkTS调用分布式数据管理接口实现。主要使用分布式数据对象(DistributedDataObject)或关系型数据库(RDB)的跨设备同步能力。开发者需在应用配置文件中声明ohos.permission.DISTRIBUTED_DATASYNC权限,并实现数据对象的监听与同步逻辑。备份时数据自动同步至可信设备,恢复时从同步设备获取数据。无需依赖Java或C语言,使用ArkTS和系统提供的分布式数据服务即可完成。

在HarmonyOS Next中,应用数据备份与恢复的核心是使用文件系统API和序列化技术。以下是实现此功能的简要流程:

  1. 数据导出与序列化: 使用@ohos.file.fs模块访问应用沙箱目录(如filesDir),将结构化数据(如对象数组)通过JSON.stringify()转换为JSON字符串,并写入文件(如backup.json)。需注意处理异步文件操作和异常。

  2. 备份文件生成与存储: 生成的JSON文件可存储在应用沙箱内,但为支持用户导出,建议通过picker模块调用系统文件选择器,将备份文件保存到公共目录(如文档文件夹)。关键步骤包括创建picker实例并配置保存选项。

  3. 数据恢复与反序列化: 恢复时,同样通过picker选择备份文件,使用fs.readText()读取内容后,用JSON.parse()解析为原始数据结构。需验证JSON格式有效性,并确保恢复的数据与当前应用版本兼容。

  4. 权限与注意事项

    • 声明ohos.permission.READ_MEDIAohos.permission.WRITE_MEDIA权限(仅公共目录需要)。
    • 备份/恢复操作建议在异步任务中执行,避免阻塞UI。
    • 可考虑对敏感数据加密后再备份。

示例代码片段(导出):

import fs from '@ohos.file.fs';
import picker from '@ohos.file.picker';

// 将数据对象转为JSON并写入沙箱文件
const data = { /* 应用数据 */ };
const filePath = context.filesDir + '/backup.json';
await fs.writeText(filePath, JSON.stringify(data));

// 通过选择器保存到公共目录
const savePicker = new picker.DocumentSavePicker();
savePicker.addSuffixType('json');
const uri = await savePicker.save();
// 将沙箱文件复制到uri指向的公共位置

恢复过程与之相反,通过选择器获取文件URI后读取并解析JSON。此方案平衡了灵活性与系统集成度,适用于多数轻量级数据备份场景。

回到顶部