数据结构与本地数据库 08:导出、备份与独立完成卡片库

课程首页 · 全部知识课程 · 返回专题主页

本系列第 8/8 课,建议 45–60 分钟(估算)。先完成上一课。

下载本课完成工程 .aia

这课解决什么

CSV 适合表格检查,JSON 保留字典结构。CSV 必须使用表格转换积木处理逗号、引号和换行,文件保存是异步动作,收到 AfterFileSaved 后才能分享。导入备份仍遵循本课程去重规则,不保证保留旧设备 ID。

先预测,再运行

SaveFile 后立刻 ShareFile,会一定读到完整文件吗?

先记下自己的答案,运行起始工程与完成工程比较;答案见文末。

开始实战

以上一课完成工程为起点,先导入并运行,再另存为本课作业。

阶段工程各自保存数据;导入下一课不会自动带走手机上的旧数据。练习使用本课示例数据,迁移方法在数据课程第六课单独讲解。

新增或调整的组件

实例名 组件 本课配置
标签_标题 标签 Width=Fill parent;FontSize=24;TextColor=#183153;Text=知识卡片 · 第 8课
微数据库1 微数据库 Namespace=CardsB08
按钮_导出CSV 按钮 Width=Fill parent;BackgroundColor=#2563EB;TextColor=#FFFFFF;FontSize=16;Text=导出 CSV 并分享
按钮_备份 按钮 Width=Fill parent;BackgroundColor=#2563EB;TextColor=#FFFFFF;FontSize=16;Text=备份为 JSON
分享1 分享 沿用默认值

逐步搭建

  1. 导出先建立包含列名的二维表,再 csvTable 转换并保存 cards.csv。
  2. 备份用 JsonObjectEncode 保存 cards-backup.json,等待保存完成再打开分享。
  3. 在同一应用内把导入文件名改成 cards-backup.json 读取备份;本期只导入内容,不恢复错题统计和旧 ID。
  4. 完成添加、修改、筛选、导入、事务和导出全流程,使用表格软件检查中文、逗号、换行;核对 JSON 字段。

知识卡片与错题库第8课运行状态布局预览

图来自本课最终工程执行积木后的状态,为 HTML 近似预览;不是手机截图。

核心积木与数据流

下面是本课完成工程中的核心代码,包含所需全局变量和过程。可在块图中追踪数值,再回到工程对照完整事件;合并到已有工程时,同名事件合并处理。

global 卡片 = list(makedict(pair("id", 1), pair("question", "中国历史朝代顺序从哪里查?"), pair("answer", "按资料的年代字段排序"), pair("category", "历史"), pair("wrong", 0)), makedict(pair("id", 2), pair("question", "列表第一个索引是多少?"), pair("answer", "1"), pair("category", "编程"), pair("wrong", 0)))



when 按钮_导出CSV.Click() {
var 表 = list(list("id","question","answer","category","wrong"))
foreach 项 in 卡片 { listadd(表,list(dictget(项,"id",0),dictget(项,"question",""),dictget(项,"answer",""),dictget(项,"category",""),dictget(项,"wrong",0))) }
文件管理器1.SaveFile(csvTable(表),"cards.csv")
}

中途检查与排错

本课以下控制与数据流已执行最终归档中的真实积木检查。请在伴侣或安装的 APK 中按相同场景操作,记录实际结果;自动检查通过不代表手机已实测。

  1. 按索引读取详情。
  2. 空题不保存。
  3. 含引号逗号换行的记录保存。
  4. 重启完整恢复。
  5. 筛选后按稳定ID修改。
  6. 倒序保持记录映射。
  7. 取消删除保留。
  8. 确认删除正确对象。
  9. 实际读取嵌套asset JSON、重复导入去重。
  10. 错误顶层、缺字段、坏JSON与资源不存在拒绝。
  11. 已删除ID不复用。
  12. SQLite就绪、绑定参数和迁移只执行一次。
  13. 错题事务成功、第二步失败回滚。
  14. CSV真实文件可解析、保存后分享、JSON备份完整。

排查时先确定出错的是输入、状态、数据读取还是显示;用标签暂时显示关键值,每次只改变一个条件。

内置 SQLite 无需导入扩展。本期 JSON 导入用于内容合并;备份文件含统计字段,但现有导入流程只导入题目、答案和分类,不是完整数据库恢复。

两个理解题与独立改造

  1. SaveFile 后立刻 ShareFile,会一定读到完整文件吗?
  2. 复制 .aia 和备份用户数据是否是一回事?

独立改造: 增加真正的完整恢复功能,明确合并/替换并恢复错题流水。

先完成自己的工程,再对照答案。检查成功路径,也检查空数据、重复操作和取消;写出你改动的规则。

查看预测与练习参考答案

预测: 不会。保存完成前文件可能不存在或不完整,应在 AfterFileSaved 中分享。

追踪: 不是。源码归档与设备数据库分开;数据备份还需结构版本和恢复规则。

改造思路: 备份结构增加 schemaVersion、cards、reviews、nextId;验证全部字段后在事务中恢复,失败不破坏原库。替换前确认,不能简单追加。

完成与下一步

保存自己的工程并导出 .aia;给文件命名以区分本课作业和参考源码。请用自己的话解释本课知识,并展示一次失败输入的处理。

上一课 · 毕业了:返回课程首页查看迁移任务

文档反馈