Android 学习笔记 D14第二周验收取消全部收藏为什么不能删除缓存摘要通过“取消所有本地收藏”这个真实业务变更检验网络、分页、搜索、数据库与 UI 的边界并设计能证明缓存未被误删的验证。标签Android、项目复盘、数据一致性、测试、面试表达本文对应 28 天课程 D14回顾《第一行代码》第 3 版第 7、10、11、13 章涉及的存储、异步、网络与 Room。今天冻结新框架用一个小需求检查第二周的代码是否能承受变化。下面是可执行的验收方案和推演不虚构已经发生的个人排错经历。1. 把需求写到能够判断对错需求是“取消全部本地收藏”不是“重置应用数据”。操作完成后收藏页为空首页和详情的收藏标记全部取消已经缓存的文章元数据与首页顺序保留断网重启仍可以看到先前缓存的文章。这个功能仅针对当前本地库不调用服务端账号的收藏接口也不影响主题设置。如果只在 UI 中把收藏列表赋为空重启后数据库会重新发出旧记录功能没有真正完成。如果直接清空整个数据库收藏虽然消失但首页缓存也丢失需求同样失败。一个操作是否正确既要检查目标发生的变化也要检查本应保留的数据。这也是分开存储用户选择与网络缓存的实际收益需求可以对应到清楚的表和 DAO 操作。若当前把缓存和收藏塞进同一张表也可以用精确更新完成但必须确认不会把文章内容一起删除。2. 从按钮追踪到数据库再从数据库返回页面事件路径设计为用户点击、ViewModel 发起、Repository 调用收藏 DAO、数据库提交、观察流发出新值、相关页面更新。按钮的忙碌状态用于防止重复触发并反馈执行过程但收藏数量应由数据库查询决定不能长期依赖一个手工维护的减法计数。以下是局部 Room 3 DAO 扩展与 Repository 装配示例沿用 D12 的bookmark表代码未在工程编译。后文检查步骤中的快照读取能力需由测试 DAO 提供不能当作已经存在的项目方法。DaointerfaceBookmarkMaintenanceDao{Query(DELETE FROM bookmark)suspendfunclearBookmarks():Int}classBookmarkRepository(privatevaldao:BookmarkMaintenanceDao){suspendfunclearAllLocalBookmarks():Intdao.clearBookmarks()}单条删除语句在数据库中完成本次修改返回行数可用于诊断或操作反馈。如果还要同步修改多张关联表应把需要共同提交的本地写入放入事务。不能把“先清收藏、后发网络”包装成一个跨网络的数据库事务并假定两边拥有同样的原子性。Room DAO 写入说明操作失败时保留原有收藏显示并给出重试入口成功后由查询推送空收藏集合。重复执行清空可以返回零行属于可接受的幂等效果不应被误判为数据库故障。UI 应区分“正在清空”与“目前没有收藏”避免用同一个状态同时表达过程和结果。3. 一条足够有力的检查在测试库插入文章 A、B、C其中 B、C 为收藏首页顺序为 C、A、B。清空之前读取文章内容快照、首页成员顺序和收藏 ID。执行 Repository 的清空入口再查询三组数据。预期收藏为空而文章内容快照与首页成员顺序逐项相同。准备cache [A, B, C]home [C, A, B]bookmark [B, C] 操作repository.clearAllLocalBookmarks() 断言bookmark 为空 断言cache 的 ID、标题、作者、URL 均与操作前相同 断言home 的 ID 顺序与操作前相同 再次执行返回删除数量为 0以上断言仍成立只比较缓存数量还不够因为删除三条后插入另外三条数量一样但内容已损坏。因此检查关键字段与顺序不以“页面还有三行”作为唯一证据。随后断网重启做一次集成验证确认可见页面也使用这份未被删除的缓存。测试完成后再记录实际结果文中的预期不能提前写成“全部通过”。并发场景也应有约定清空时是否允许另一页面新增收藏本课可通过 Repository 串行管理收藏写入按提交顺序定义最终状态。若清空之后用户又明确添加一篇它应该重新出现“清空完成后永远为零”并不是合理的不变量。4. 第二周其余链路怎么串起来先在线加载首页进入详情收藏再退出重开确认数据能从持久层恢复。随后断网查看缓存同时看到刷新失败提示。搜索使用 Fake 制造 A 慢、B 快确认最终只接受 B分页让请求参数一失败后重试核对仍请求一。这些场景对应不同事实不应一次打开所有故障开关。每次只改变一个条件日志记录操作、输入、请求身份、页码和提交结果。若出现首页收藏标记不更新先看 DAO 的记录是否删除记录已删除再查查询与合并不要一上来就重建 Activity 或发送全局“刷新”事件掩盖问题。这样可以把一段复盘写成可核验的因果链现象是什么、哪些假设被排除、证据在哪一层、修改如何改变状态路径。没有真实执行过时就写“计划验证”与“预期”不要为了博客完整度编造一段自己的排错故事。5. 原创面试问答与追问问一如何证明清空收藏没有误删缓存比较操作前后的缓存字段和首页成员顺序再断网重启。追问只检查行数够吗不够同样数量也可能是不同数据。问二清空后立刻又有一条收藏一定是 bug 吗不一定要看是否有后续合法添加以及提交顺序。追问怎样减少歧义串行管理相关写入明确状态由数据库提交结果决定。问三复盘为什么不能只列做了哪些功能功能清单不解释数据正确性与排错能力。追问面试时怎么讲选择一次明确变更说明边界、反例、实现和验证证据。问答为针对本验收原创整理可以在复习面试鸭的线程、异步基础后继续练习数据库与数据架构部分属于本课程扩展不是题库原文。6. 验收产物应该是什么交付一份数据流草图、一张故障场景表、一条清空收藏但保留缓存的检查记录以及尚未通过的限制说明。能够独立在六十分钟内完成小变更并解释数据边界比继续堆库更能证明第二周学到了什么。书本知识在这里形成闭环异步负责等待网络负责更新来源数据库负责长期事实UI 根据可观察状态展示结果。