数据结构与本地数据库 02:字典描述卡片,ID 表示身份

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

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

下载本课完成工程 .aia

这课解决什么

一张卡片是一个字典,题目、答案、分类是字段,ID 是身份。列表负责排列多张卡片;字典字段通过名字读,新增字段不需要整体挪索引。

先预测,再运行

两个题目相同但 ID 不同的卡片,是同一条记录吗?

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

开始实战

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

完成工程可以查看答案;独立作业请保留自己的修改。

新增或调整的组件

实例名 组件 本课配置
标签_标题 标签 Width=Fill parent;FontSize=24;TextColor=#183153;Text=知识卡片 · 第 2课

逐步搭建

  1. 将并行列表改为卡片字典列表,字段为 id/question/answer/category/wrong。
  2. 刷新遍历卡片,显示标题,同时保存显示记录列表。
  3. 选中后先在显示列表找卡片,再读答案字段。
  4. 画出“卡片列表→某项字典→answer”的结构图,确认顶层不是一个大文本。

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

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

核心积木与数据流

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

global 显示 = []
global 选中ID = 0



when 列表显示框_卡片.AfterPicking() {
var i = 列表显示框_卡片.SelectionIndex
if i >= 1 and i <= length(显示) {
var 项 = 显示[i]
选中ID = dictget(项,"id",0)
标签_详情.Text = dictget(项,"answer","")
}
}

中途检查与排错

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

  1. 按索引读取详情。

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

当前课仅实现表中对应功能,导出和备份在第八课加入。SQLite 在第六课加入,本课仍使用列表或 TinyDB。

两个理解题与独立改造

  1. 两个题目相同但 ID 不同的卡片,是同一条记录吗?
  2. 字典新增字段会改变原有 answer 的取值位置吗?

独立改造: 增加 source 字段,在详情里显示来源。

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

查看预测与练习参考答案

预测: 不是。题目是内容,ID 是身份;修改题目不会产生新身份。

追踪: 按键名读取不依赖字段顺序,新增字段不会挪动旧字段的语义。

改造思路: 给每张字典添加 source;读取时提供默认值以兼容旧卡片。字段变化不改变 id。

完成与下一步

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

上一课 · 下一课:增删改与 TinyDB 恢复

文档反馈