HarmonyOS应用开发实战:萌宠日记 - 数据备份与导出功能
HarmonyOS应用开发实战萌宠日记 - 数据备份与导出功能前言数据备份与导出是保障用户数据安全的重要功能。在萌宠日记中备份功能通过ExtensionAbilitybackup 类型实现系统级备份恢复导出功能通过文件 API将日记数据导出为JSON 或文本文件方便用户迁移或存档。数据安全是用户信任的基石一套完善的备份导出机制能让用户放心使用应用。本文将从萌宠日记中数据备份与导出功能的实现出发深入解析备份扩展的配置、文件导出流程、数据导入恢复、用户数据的安全保障以及备份状态的 UI 展示。一、备份扩展配置1.1 BackupExtensionAbility// EntryBackupAbility.ets — 备份扩展import{BackupExtensionAbility}fromkit.CoreFileKit;exportdefaultclassEntryBackupAbilityextendsBackupExtensionAbility{onBackup():void{console.log(EntryBackupAbility onBackup);}onRestore():void{console.log(EntryBackupAbility onRestore);}}1.2 模块配置// module.json5 中配置备份扩展 { extensionAbilities: [ { name: EntryBackupAbility, srcEntry: ./ets/entrybackupability/EntryBackupAbility.ets, type: backup, exported: false, metadata: [ { name: ohos.extension.backup, resource: $profile:backup_config } ] } ] }二、备份配置文件2.1 backup_config.json{ allowToBackupPersistent: true, includeFiles: [ data/storage/el2/database/, data/storage/el2/base/preferences/, data/storage/el2/base/files/ ], excludeFiles: [ data/storage/el2/base/cache/ ] }2.2 备份路径说明路径内容是否备份el2/database/关系型数据库日记、健康记录✅el2/base/preferences/用户首选项设置、草稿✅el2/base/files/用户文件导出文件等✅el2/base/cache/缓存文件临时图片等❌三、数据导出功能3.1 导出为 JSONimport{fileIo}fromkit.CoreFileKitasyncexportDiariesToFile():Promisestring{constdiariesthis.loadAllDiaries()constjsonStrJSON.stringify(diaries,null,2)constfilePath${this.context.filesDir}/diaries_backup_${Date.now()}.jsonconstfilefileIo.openSync(filePath,fileIo.OpenMode.CREATE|fileIo.OpenMode.WRITE_ONLY)fileIo.writeSync(file.fd,jsonStr)fileIo.closeSync(file)returnfilePath}3.2 导出格式{exportTime:2024-05-05T10:30:00.000Z,appVersion:1.0.0,diaries:[{id:diary_001,title:愉快的周末,content:今天带豆豆去公园...,mood:0,location:公园,weather:晴天 26°C,createdAt:2024-05-05T10:00:00.000Z}],healthRecords:[],pets:[]}四、数据导入功能4.1 导入 JSON 文件asyncimportDiariesFromFile(filePath:string):Promisenumber{try{constfilefileIo.openSync(filePath,fileIo.OpenMode.READ_ONLY)constcontentfileIo.readSync(file.fd)fileIo.closeSync(file)constdataJSON.parse(content)constcountawaitthis.saveImportedData(data)returncount}catch(err){console.error(Import failed:,JSON.stringify(err))throwerr}}4.2 导入冲突处理enumImportStrategy{SKIP_EXISTING,// 跳过已存在的OVERWRITE,// 覆盖已存在的KEEP_BOTH// 保留两者}asyncsaveImportedData(data:ExportData,strategy:ImportStrategy):Promisenumber{letcount0for(constdiaryofdata.diaries){constexistingawaitthis.findDiaryById(diary.id)if(existing){if(strategyImportStrategy.SKIP_EXISTING)continueif(strategyImportStrategy.OVERWRITE)awaitthis.updateDiary(diary)if(strategyImportStrategy.KEEP_BOTH){diary.id${diary.id}_imported_${Date.now()}awaitthis.insertDiary(diary)}}else{awaitthis.insertDiary(diary)}count}returncount}五、导出进度 UI5.1 导出状态展示StateexportState:idle|exporting|success|erroridleStateexportProgress:number0// 导出按钮Button(this.exportStateexporting?导出中...:导出数据).width(100%).height(44).backgroundColor(#F5A623).fontColor(Color.White).enabled(this.exportState!exporting).onClick(()this.startExport())// 导出成功提示if(this.exportStatesuccess){Text(✅ 导出成功).fontSize(14).fontColor(#4CAF50)}六、备份恢复的生命周期6.1 备份生命周期用户触发备份 → 系统调用 onBackup() ↓ 应用准备数据 → 关闭数据库连接、刷新缓存 ↓ 系统收集文件 → 读取 backup_config.json ↓ 文件打包加密 → 存储到系统备份目录 ↓ onBackup() 完成 → 备份结束6.2 恢复生命周期用户触发恢复 → 系统还原文件到沙箱 ↓ 系统调用 onRestore() ↓ 应用重建数据 → 重新打开数据库、加载偏好 ↓ 刷新 UI → 显示恢复后的数据 ↓ onRestore() 完成 → 恢复结束七、导出文件的分享7.1 系统分享面板import{share}fromkit.AppServiceKitasyncshareExportedFile(filePath:string):Promisevoid{constshareData:share.ShareData{filePath:[filePath],mimeType:application/json}awaitshare.share(shareData)}八、导出文件的加密8.1 加密导出import{cipher}fromkit.CipherKitasyncexportEncrypted(password:string):Promisestring{constdataJSON.stringify(this.loadAllDiaries())constencryptedcipher.encrypt(data,password)constfilePath${this.context.filesDir}/diaries_encrypted_${Date.now()}.datawaitwriteFile(filePath,encrypted)returnfilePath}九、备份策略设计9.1 自动备份// 自动备份策略StorageProp(autoBackup)autoBackup:booleanfalseaboutToAppear():void{if(this.autoBackup){this.scheduleAutoBackup()}}scheduleAutoBackup():void{// 每天自动备份一次constnowDate.now()constlastBackupthis.getLastBackupTime()if(now-lastBackup24*60*60*1000){this.startExport()}}9.2 备份历史管理interfaceBackupRecord{id:stringfileName:stringfileSize:numbercreatedAt:stringdiaryCount:numbertype:auto|manual}StatebackupHistory:BackupRecord[][]// 记录备份历史asyncrecordBackup(filePath:string,type:auto|manual):Promisevoid{conststatfileIo.statSync(filePath)constrecord:BackupRecord{id:backup_${Date.now()},fileName:filePath.split(/).pop()||,fileSize:stat.size,createdAt:newDate().toISOString(),diaryCount:this.diaryCount,type:type}this.backupHistory[record,...this.backupHistory]awaitthis.saveBackupHistory()}// 获取最近的备份时间getLastBackupTime():number{if(this.backupHistory.length0)return0returnnewDate(this.backupHistory[0].createdAt).getTime()}9.3 备份文件大小对比数据类型平均大小备份耗时50 篇日记25KB 1s100 篇日记50KB 1s500 篇日记250KB1-2s1000 篇日记500KB2-3s含 10 张照片2MB3-5s十、备份的 UI 交互10.1 备份管理页面BuilderBackupManager(){Column({space:16}){// 手动备份按钮Button(立即备份).width(100%).height(44).backgroundColor(#F5A623).fontColor(Color.White).borderRadius(22).onClick(()this.startExport())// 自动备份开关Row(){Text(自动备份).fontSize(15)Blank()Toggle({type:ToggleType.Switch,isOn:this.autoBackup}).onChange((v){this.autoBackupv AppStorage.set(autoBackup,v)})}.width(100%).padding(16).backgroundColor(#FFFFFF).borderRadius(12)// 备份历史列表Text(备份历史).fontSize(16).fontWeight(FontWeight.Bold)ForEach(this.backupHistory,(record:BackupRecord){Row(){Column({space:4}){Text(record.typeauto?自动备份:手动备份).fontSize(14).fontWeight(FontWeight.Medium)Text(record.createdAt).fontSize(12).fontColor(#999999)}.alignItems(HorizontalAlign.Start)Blank()Text(this.formatSize(record.fileSize)).fontSize(12).fontColor(#999999)}.width(100%).padding(16).backgroundColor(#FFFFFF).borderRadius(12)})}.padding(16)}十一、数据恢复的验证11.1 恢复前的数据校验functionvalidateExportData(data:any):boolean{// 检查必要字段if(!data.exportTime){console.error(Missing exportTime)returnfalse}if(!Array.isArray(data.diaries)){console.error(Missing diaries array)returnfalse}// 检查数据完整性for(constdiaryofdata.diaries){if(!diary.id||!diary.title){console.error(Invalid diary entry:,diary)returnfalse}}returntrue}11.2 恢复完成后的数据验证asyncverifyRestoredData():Promise{success:boolean,details:string}{constcountawaitthis.getDiaryCount()if(count0){return{success:false,details:恢复后未找到数据}}constsampleawaitthis.getLatestDiary()if(!sample||!sample.title){return{success:false,details:数据格式异常}}return{success:true,details:成功恢复${count}条日记}}十、最佳实践10.1 备份导出设计原则有序列表 — 备份导出设计的 5 个原则数据完整性确保导出数据包含所有必要字段格式标准化使用 JSON 标准格式便于跨平台迁移进度可视化导出过程中显示进度避免用户焦虑错误处理导出失败时提供重试机制和错误信息安全加密敏感数据导出时提供加密选项10.2 萌宠日记备份导出总结功能技术方案说明系统备份BackupExtensionAbility系统级自动备份数据导出JSON 文件用户手动导出数据导入JSON 解析 冲突处理三种导入策略文件加密cipher API加密导出系统分享share API分享导出文件自动备份定时器 Preferences每日自动备份总结本文从萌宠日记的数据备份与导出功能实现出发深入解析了数据安全的完整方案备份扩展BackupExtensionAbility backup_config.json数据导出JSON 格式文件导出数据导入三种冲突处理策略导出进度 UI状态管理 进度展示备份恢复生命周期onBackup / onRestore文件分享系统分享面板集成加密导出cipher API 加密保护自动备份定时自动备份策略如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力相关资源备份扩展开发指导https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/backup-extension文件管理开发指导https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/file-management数据加密指导https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/cipher分享服务开发https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/share应用沙箱路径https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/application-sandbox数据持久化https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/app-data-persistence用户数据安全https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/data-security开源鸿蒙跨平台社区https://openharmonycrossplatform.csdn.net

相关新闻

C/C++自动化交互编程:Expect库核心原理与实战应用

C/C++自动化交互编程:Expect库核心原理与实战应用

1. 项目概述:为什么要在C/C里用Expect?如果你写过C或C的自动化脚本,尤其是需要和命令行程序、交互式终端打交道的,肯定遇到过这样的场景:程序需要你输入密码,或者回答一个“yes/no”的确认,又或…

2026/9/13 17:58:10 阅读更多 →
jumamo本地语音生成工具部署与API调用全流程指南

jumamo本地语音生成工具部署与API调用全流程指南

这次我们来看一个名为 jumamo 的项目,从标题描述看,这应该是一个与语音生成或语音交互相关的工具。虽然标题本身带有调侃语气,但结合技术背景,jumamo 很可能是一个本地部署的语音模型,专注于文本到语音的转换&#xff…

2026/9/12 3:39:17 阅读更多 →
从基础搭建开始。

从基础搭建开始。

网上比较多的状态机,都是结合其实际的应用场景,包含一些特定的实现设计在里面,我们在搭建自己的状态机的时候,可以从一个细小的状态开始搭建,先搭建一个节点,然后依据同样的设计,搭建类似的多个…

2026/9/12 4:13:42 阅读更多 →

最新新闻

深入解析 lo.CountValues:用 Go 泛型统计切片元素频次的完整指南

深入解析 lo.CountValues:用 Go 泛型统计切片元素频次的完整指南

深入解析 lo.CountValues:用 Go 泛型统计切片元素频次的完整指南 【免费下载链接】lo 💥 A Lodash-style Go library based on Go 1.18 Generics (map, filter, contains, find...) 项目地址: https://gitcode.com/GitHub_Trending/lo/lo lo.Coun…

2026/9/13 17:58:23 阅读更多 →
PDF补丁丁完整上手指南:解除限制、合并重排、自动书签,一个工具箱搞定

PDF补丁丁完整上手指南:解除限制、合并重排、自动书签,一个工具箱搞定

PDF补丁丁完整上手指南:解除限制、合并重排、自动书签,一个工具箱搞定 【免费下载链接】PDFPatcher PDF补丁丁——PDF工具箱,可以编辑书签、剪裁旋转页面、解除限制、提取或合并文档,探查文档结构,提取图片、转成图片等…

2026/9/13 17:58:23 阅读更多 →
Bokeh 3.3.2 补丁版本深度解析:BoxAnnotation 默认值回退、bokehjs 算法库性能回归修复与 mypy 1.7 升级

Bokeh 3.3.2 补丁版本深度解析:BoxAnnotation 默认值回退、bokehjs 算法库性能回归修复与 mypy 1.7 升级

Bokeh 3.3.2 补丁版本深度解析:BoxAnnotation 默认值回退、bokehjs 算法库性能回归修复与 mypy 1.7 升级 【免费下载链接】bokeh Interactive Data Visualization in the browser, from Python 项目地址: https://gitcode.com/GitHub_Trending/bo/bokeh Boke…

2026/9/13 17:58:23 阅读更多 →
Taipy REST 入门指南:基于 Taipy Core 的自动化 REST API 服务

Taipy REST 入门指南:基于 Taipy Core 的自动化 REST API 服务

Taipy REST 入门指南:基于 Taipy Core 的自动化 REST API 服务 【免费下载链接】taipy Turns Data and AI algorithms into production-ready web applications in no time. 项目地址: https://gitcode.com/GitHub_Trending/ta/taipy Taipy REST 是构建在 Ta…

2026/9/13 17:58:23 阅读更多 →
Hurl 请求语法详解:从方法、URL、请求头到 Body 的完整编写指南

Hurl 请求语法详解:从方法、URL、请求头到 Body 的完整编写指南

Hurl 请求语法详解:从方法、URL、请求头到 Body 的完整编写指南 【免费下载链接】hurl Hurl, run and test HTTP requests with plain text. 项目地址: https://gitcode.com/GitHub_Trending/hu/hurl 本文基于 Hurl 官方文档 request,系统讲解 Hu…

2026/9/13 17:58:23 阅读更多 →
Argo CD 通知故障排查指南:`argocd admin notifications` 命令组实战与常见错误修复

Argo CD 通知故障排查指南:`argocd admin notifications` 命令组实战与常见错误修复

Argo CD 通知故障排查指南:argocd admin notifications 命令组实战与常见错误修复 【免费下载链接】argo-cd Declarative Continuous Deployment for Kubernetes 项目地址: https://gitcode.com/GitHub_Trending/ar/argo-cd 本指南聚焦 Argo CD 的通知&#x…

2026/9/13 17:57:23 阅读更多 →

日新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/13 0:00:24 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/13 0:00:24 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/13 0:00:24 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/13 0:00:24 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/13 0:00:24 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/13 0:00:24 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/13 16:51:11 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/12 18:29:34 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/12 19:02:44 阅读更多 →