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/7/23 8:03:04 阅读更多 →
jumamo本地语音生成工具部署与API调用全流程指南

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

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

2026/7/23 8:02:04 阅读更多 →
从基础搭建开始。

从基础搭建开始。

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

2026/7/23 8:02:04 阅读更多 →

最新新闻

Python+AI入门指南:2026年必备技能与实战教程

Python+AI入门指南:2026年必备技能与实战教程

1. 为什么PythonAI是2026年最值得入门的技能组合?Python作为当前最流行的编程语言之一,在2026年依然保持着强劲的发展势头。根据最新的开发者调查报告显示,Python在AI、数据分析、自动化等领域的应用占比超过65%。而AI技术已经从实验室走向产…

2026/7/23 17:44:19 阅读更多 →
OpenClaw:本地化AI智能体的技术架构与应用实践

OpenClaw:本地化AI智能体的技术架构与应用实践

1. OpenClaw现象级爆发的底层逻辑OpenClaw的突然走红绝非偶然,这个以"养龙虾"为代号的AI智能体项目,实际上正在掀起一场个人效率工具的范式革命。作为一款开源本地优先的AI助手系统,它解决了三个关键痛点:首先是对隐私数…

2026/7/23 17:44:19 阅读更多 →
动态频谱注意力网络在月球资源探测中的应用与优化

动态频谱注意力网络在月球资源探测中的应用与优化

1. 项目背景与核心突破清华大学与哈尔滨工业大学联合团队在AAAI 2026会议上发表的这项研究,针对AI模型在频谱分析领域长期存在的"频谱偏见"问题提出了创新解决方案。这项技术突破直接服务于国家月球基地建设中的月壤成分分析任务,解决了传统方…

2026/7/23 17:44:19 阅读更多 →
向量数据库实战:选型、调优与落地~系列文章15:多模态向量搜索:图片、音频、视频统一检索的工程实现

向量数据库实战:选型、调优与落地~系列文章15:多模态向量搜索:图片、音频、视频统一检索的工程实现

多模态向量搜索:图片、音频、视频统一检索的工程实现 🖼️🔥 本文是《向量数据库实战:选型、调优与落地》专栏第 15 篇 ⏱️ 阅读时间:约 13 分钟🎯 开篇:不只是文本 2025 年,AI 应用…

2026/7/23 17:44:19 阅读更多 →
麒麟信安亮相2021中国石油石化企业信息技术交流大会 暨油气产业数字化转型高峰论坛

麒麟信安亮相2021中国石油石化企业信息技术交流大会 暨油气产业数字化转型高峰论坛

由中国石油、中国石化、中国海油、中国中化等主办的“2021中国石油石化企业信息技术交流大会暨展示会”于5月12-14日在北京召开。本次会会议主题为“以新发展理念推动数字化转型,助力油气产业高质量发展”,深度探讨企业在数字化转型中面临的共性问题、在…

2026/7/23 17:44:19 阅读更多 →
GLM-5.2 低价冲击:企业开始认真给 Token 算账

GLM-5.2 低价冲击:企业开始认真给 Token 算账

GLM-5.2 把模型竞争拉回成本账,企业将用路由重新分配智能。企业用 AI 的第一阶段,大家关心的是「能不能用」。第二阶段,问题变成「用一次多少钱」。 最近围绕 智谱 GLM-5.2 的讨论,正好踩中了这个切换点。 讨论里最吸引人的不是又…

2026/7/23 17:43:19 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 8:58:19 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 19:43:43 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 12:54:44 阅读更多 →

月新闻