Day10_开源鸿蒙_Flutter_for_OpenHarmony_离线笔记_全量备份导出导入
开源鸿蒙 Flutter for OpenHarmony离线笔记收官全量备份导出/导入欢迎加入开源鸿蒙跨平台社区https://openharmonycrossplatform.csdn.net离线笔记做到 Day9单条笔记已经能导出/导入二维码复制文本。但到了真正“换机/重装/迁移”的场景大家更需要的是全量备份。Day10 收官把这件事补齐一键把当前数据库里所有笔记导出成一段 JSON 文本复制到剪贴板另一台设备/重装后直接粘贴导入恢复。这篇的重点依然是“怎么把三方库用到位”但全量备份本身不需要新增插件数据来自sqflite私密笔记的密文字段照样备份不会导出明文复制/粘贴用 Flutter 自带剪贴板即可1. 全量备份为什么要单独做单条导出不够用单条导出的缺点很明显50 条笔记要导出 50 次迁移成本高容易漏全量备份的目标只有一个一次复制一次导入全部恢复。2. 备份格式v1包含 salt notes 数组为了兼容 Day4 的私密笔记我们把salt_b64一起带上。全量备份结构如下{v:1,salt_b64:xxxx,notes:[{title:xxx,content:xxx,pinned:0,is_private:0,content_cipher:null,content_nonce:null,content_mac:null,created_at:0,updated_at:0}]}关键点普通笔记content有明文私密笔记content固定为空密文在content_cipher/nonce/mac所以全量导出不会“把私密内容明文泄露”。3. DAO 增加 listAllNotes一次性取出所有未删除笔记 文件lib/features/note/data/note_dao.dartFutureListNotelistAllNotes()async{finaldbawait_db.database;finalrowsawaitdb.query(notes,where:is_deleted ?,whereArgs:const[0],orderBy:pinned DESC, updated_at DESC,);returnrows.map(_fromRow).toList(growable:false);}这里不设 limit因为我们就是为了“全量”。4. Repository 实现全量导出/导入 文件lib/features/note/data/note_repository.dart4.1 导出exportAllNotesAsJson()FutureStringexportAllNotesAsJson()async{constsaltKeyprivate_pin_salt_b64;finalsaltB64await_dao.appDb.getKv(saltKey);finalallawait_dao.listAllNotes();finalpayloadString,Object?{v:1,salt_b64:saltB64,notes:all.map((note)String,Object?{title:note.title,content:note.content,pinned:note.pinned?1:0,is_private:note.isPrivate?1:0,content_cipher:note.contentCipher,content_nonce:note.contentNonce,content_mac:note.contentMac,created_at:note.createdAt.millisecondsSinceEpoch,updated_at:note.updatedAt.millisecondsSinceEpoch,}).toList(growable:false),};returnjsonEncode(payload);}4.2 导入importAllNotesFromJson(text)导入逻辑也很直接解析 JSON校验v如果带了salt_b64先写回app_kv循环notes逐条 insertFutureintimportAllNotesFromJson(Stringtext)async{constsaltKeyprivate_pin_salt_b64;finalobjjsonDecode(text);if(objis!Map)throwStateError(Invalid json);finalvobj[v];if(v!1)throwStateError(Unsupported version);finalsaltB64obj[salt_b64];if(saltB64isStringsaltB64.isNotEmpty){await_dao.appDb.setKv(saltKey,saltB64);}finallistobj[notes];if(listis!List)throwStateError(Missing notes);varcount0;for(finaliteminlist){if(itemis!Map)continue;...await_dao.insert(note);count;}returncount;}5. 新增一个“数据工具”页面导出复制 粘贴导入 文件lib/features/debug/ui/data_tools_page.dart5.1 一键导出复制到剪贴板finaltextawaitwidget.repo.exportAllNotesAsJson();awaitClipboard.setData(ClipboardData(text:text));awaitshowToast(已复制全量备份);5.2 粘贴导入导入成功提示“导入了多少条”finalnawaitwidget.repo.importAllNotesFromJson(text);awaitshowToast(已导入$n条);Navigator.pop(context,true);6. 入口列表页右上角加一个“数据工具”按钮 文件lib/features/note/ui/notes_list_page.dartIconButton(onPressed:()async{finalchangedawaitNavigator.of(context).pushbool(MaterialPageRoute(builder:(_)DataToolsPage(repo:_repo),),);if(changedtruemounted){await_controller.load();}},icon:constIcon(Icons.settings),tooltip:数据工具,),导入成功后返回列表自动刷新。7. 自测清单Day10创建几条普通笔记 私密笔记 置顶笔记打开“数据工具” → 点导出 → 粘贴到备忘录确认是一段 JSON清空应用数据/重装或换设备后 → 打开“数据工具” → 粘贴 JSON → 导入返回列表笔记数量一致置顶排序仍然有效私密笔记仍然需要 PIN 才能看到正文导入不会变明文
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2595052.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!