本系列第 8/8 课,建议 45–60 分钟(估算)。先完成上一课。
这课解决什么
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 |
分享 | 沿用默认值 |
逐步搭建
- 导出先建立包含列名的二维表,再 csvTable 转换并保存 cards.csv。
- 备份用 JsonObjectEncode 保存 cards-backup.json,等待保存完成再打开分享。
- 在同一应用内把导入文件名改成 cards-backup.json 读取备份;本期只导入内容,不恢复错题统计和旧 ID。
- 完成添加、修改、筛选、导入、事务和导出全流程,使用表格软件检查中文、逗号、换行;核对 JSON 字段。

图来自本课最终工程执行积木后的状态,为 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 中按相同场景操作,记录实际结果;自动检查通过不代表手机已实测。
- 按索引读取详情。
- 空题不保存。
- 含引号逗号换行的记录保存。
- 重启完整恢复。
- 筛选后按稳定ID修改。
- 倒序保持记录映射。
- 取消删除保留。
- 确认删除正确对象。
- 实际读取嵌套asset JSON、重复导入去重。
- 错误顶层、缺字段、坏JSON与资源不存在拒绝。
- 已删除ID不复用。
- SQLite就绪、绑定参数和迁移只执行一次。
- 错题事务成功、第二步失败回滚。
- CSV真实文件可解析、保存后分享、JSON备份完整。
排查时先确定出错的是输入、状态、数据读取还是显示;用标签暂时显示关键值,每次只改变一个条件。
内置 SQLite 无需导入扩展。本期 JSON 导入用于内容合并;备份文件含统计字段,但现有导入流程只导入题目、答案和分类,不是完整数据库恢复。
两个理解题与独立改造
- SaveFile 后立刻 ShareFile,会一定读到完整文件吗?
- 复制 .aia 和备份用户数据是否是一回事?
独立改造: 增加真正的完整恢复功能,明确合并/替换并恢复错题流水。
先完成自己的工程,再对照答案。检查成功路径,也检查空数据、重复操作和取消;写出你改动的规则。
查看预测与练习参考答案
预测: 不会。保存完成前文件可能不存在或不完整,应在 AfterFileSaved 中分享。
追踪: 不是。源码归档与设备数据库分开;数据备份还需结构版本和恢复规则。
改造思路: 备份结构增加 schemaVersion、cards、reviews、nextId;验证全部字段后在事务中恢复,失败不破坏原库。替换前确认,不能简单追加。
完成与下一步
保存自己的工程并导出 .aia;给文件命名以区分本课作业和参考源码。请用自己的话解释本课知识,并展示一次失败输入的处理。
扫码添加客服咨询