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

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

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

2026/10/16 19:02:28 阅读更多 →
从基础搭建开始。

从基础搭建开始。

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

2026/10/17 18:09:46 阅读更多 →

最新新闻

把Claude当成AI同事:一套减少返工的高效工作流搭建指南

把Claude当成AI同事:一套减少返工的高效工作流搭建指南

1. 为什么我决定把 Claude 当成"同事"而不是"搜索框"1.1 一个月的试验是怎么开始的事情要从上个月说起。那段时间我手头同时压着三个项目:一个老活动的复盘报告还没交,一个新上线的功能要赶推广方案,还有日常的周报、邮件…

2026/10/19 7:39:21 阅读更多 →
AIGC检测原理与降AI率实战:从困惑度到人工润色指南

AIGC检测原理与降AI率实战:从困惑度到人工润色指南

大概半年前,我在内容团队帮着审一批AI辅助产出的稿件。当时的流程很明确:先用AI搭出初稿,再人工做第二遍充实,最后统一过一遍AIGC检测工具。结果有一篇稿子让我印象很深——逻辑清楚、用词规范、结构完整,怎么看都挑不…

2026/10/19 7:39:21 阅读更多 →
降AI率实操指南:从检测原理到改写平台与提示词注入人味

降AI率实操指南:从检测原理到改写平台与提示词注入人味

2025年年底,一个朋友让我帮忙看看他给客户写的一版方案,说总感觉哪里不对。我看了三分钟就直说了:“这不是你自己写的吧?”他愣住,问我怎么知道的。我指了指开头那段——“综上所述,本方案旨在通过多维度协…

2026/10/19 7:39:21 阅读更多 →
NBA球员数据分析闭环:从爬虫到聚类可视化的工程化实践

NBA球员数据分析闭环:从爬虫到聚类可视化的工程化实践

简介:本资源是一份面向计算机专业本科生的Python数据可视化实战项目,专为毕业设计、课程设计及期末大作业打造,聚焦NBA球员多维数据的采集、清洗、聚类与动态可视化分析。项目代码全部手写,含详尽中文注释,覆盖数据爬虫…

2026/10/19 7:39:21 阅读更多 →
威利普LED-ECS编辑控制系统V5.3实用指南:屏参设置与节目下发

威利普LED-ECS编辑控制系统V5.3实用指南:屏参设置与节目下发

简介:威利普LED-ECS编辑控制系统V5.3免安装版专为LED图文控制卡用户打造,面向需要快速完成显示屏内容编辑与设备管理的企业、广告公司及个人使用者。压缩包解压即用,省去安装环节,适合在多台电脑间迁移,也降低环境配置…

2026/10/19 7:39:21 阅读更多 →
AI原生开发平台架构规划与落地实操指南

AI原生开发平台架构规划与落地实操指南

做技术交流的时候,被问得最多的一个问题,差不多就是标题这句:AI原生开发平台到底是什么、架构怎么规划、怎么落地。说实话,每次回答完我都觉得还有话没说完,因为这三个问题其实是层层递进的——概念不清就谈不上规划&a…

2026/10/19 7:38:21 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →