HarmonyOS应用实战-启示散页-65-收藏别只按文本判断:给重复答案建立稳定来源身份 HarmonyOS 应用实战 65收藏别只按文本判断给重复答案建立稳定来源身份同一句答案可能出现在多个题库里。只按answerText判断收藏会把“恋爱题库里的再观察”和“职业题库里的再观察”压成同一条。用户从收藏页回看时不知道答案来自哪里取消收藏也可能误删另一条。本文解决四个问题把收藏身份从文本升级为来源身份保存 deckId、answerId 和文本快照兼容旧的按文本收藏验证重复答案、删除题库和迁移路径按文本去重会丢失业务来源文本相同不代表业务含义相同。收藏应该记录用户当时收藏的是哪套题库里的哪条答案而不是只记一段字符串。故障链两个题库都有同文答案 - FavoriteService.has(text) 命中 - 第二条无法收藏 - 收藏页来源不可信收藏的根问题是身份不是按钮状态。同一句答案在不同题库里含义不同只用文本去重会把来源压扁。FavoriteIdentity 由来源组成稳定身份至少需要 deckId 和 answerId。answerText 是展示快照不应该成为唯一主键。interfaceFavoriteIdentity{deckId:string;answerId:string;}interfaceFavoriteRecord{id:string;identity:FavoriteIdentity;answerTextSnapshot:string;deckNameSnapshot:string;createdAt:number;}FavoriteIdentity要由来源字段组成。deckId answerId表示用户收藏的是哪个业务对象文本只是展示快照。收藏服务按 identity 判断是否存在同文本不同来源允许同时收藏同来源重复点击才是取消或保持。classFavoriteService{asynchas(identity:FavoriteIdentity):Promiseboolean{constrecordsawaitFavoriteRepository.loadAll();returnrecords.some((item)item.identity.deckIdidentity.deckIditem.identity.answerIdidentity.answerId);}asyncadd(record:FavoriteRecord):Promisevoid{if(awaitthis.has(record.identity)){return;}awaitFavoriteRepository.saveAll([record,...awaitFavoriteRepository.loadAll()]);AppStorage.setOrCreate(favorite.changedAt,Date.now());}}服务按 identity 判断存在性后同文本不同来源可以并存同来源重复点击才会变成取消或忽略。旧收藏迁移要标记 legacy旧数据只有文本时不能凭空还原来源。迁移时应保留 legacy 状态页面展示“来源未知”而不是伪造 deckId。interfaceLegacyFavoriteRecord{id:string;answerTextSnapshot:string;deckNameSnapshot?:string;legacy:true;}functionmigrateFavorite(raw:FavoriteRecord|LegacyFavoriteRecord):FavoriteRecord|LegacyFavoriteRecord{if(identityinraw){returnraw;}return{...raw,legacy:true};}旧收藏不能伪造来源。没有deckId和answerId的历史数据只能标记 legacy让页面诚实展示“来源未知”。收藏页展示来源快照不依赖题库仍存在题库删除后收藏仍应能展示当时的答案文本和题库名快照如果来源仍存在再提供跳转回题库。Componentstruct FavoriteCard{Proprecord:FavoriteRecord|LegacyFavoriteRecord;build(){Column(){Text(this.record.answerTextSnapshot)Text(deckNameSnapshotinthis.record?this.record.deckNameSnapshot??来源未知:来源未知)}}}收藏页展示快照是为了在原题库被删除后仍然可读。跳转回来源题库是增强能力不应该成为展示收藏的前置条件。验证重复答案和旧数据准备两个题库包含相同答案分别收藏确认收藏页出现两条且来源不同。再准备旧格式收藏确认不会被误判为新身份。验证同文本不同 deck 可同时收藏同 identity 再点不重复删除来源题库后收藏卡片仍展示快照legacy 收藏不伪造来源。重复答案和旧数据要放在同一轮验证里。否则新逻辑看似正确却可能在迁移旧收藏时误删用户内容。收藏身份排查表如果收藏逻辑看起来异常先看主键由什么组成。现象先看哪里修复同文答案不能分别收藏是否按 text 去重改用 deckIdanswerId删除题库后收藏空白是否只读 live deck保存快照旧收藏来源乱是否伪造来源标记 legacy排查收藏异常时先看主键组成。只要主键还是文本后续所有来源展示和取消收藏都会不稳定。收藏身份要和展示快照分开验deckId answerId解决的是身份问题answerTextSnapshot deckNameSnapshot解决的是展示问题。两者都要验不能只看按钮是否变成已收藏。验证样本 1. deckA.answer01 再观察一天 2. deckB.answer09 再观察一天 3. 两条都收藏列表应出现两条来源不同。 4. 删除 deckA 后deckA 的收藏仍显示快照但不提供跳转。这个样本能同时覆盖重复文本、来源展示和删除后的可读性。旧数据迁移不要伪造确定性旧收藏只有文本时系统不知道它来自哪个题库。更负责任的处理是标记 legacy并在 UI 上弱化来源而不是根据文本反查一个“看起来可能”的题库。旧数据状态处理原因只有答案文本标记 legacy无法还原来源有题库名快照仅用于展示题库名可能重名或改名后续再次收藏同文答案生成新 identity不与 legacy 强行合并迁移文章尤其要守住这个边界不确定就是不确定不能为了列表整齐伪造业务事实。交付记录看三类证据收藏重构完成后至少留下三类证据重复答案样本、旧数据迁移样本、删除来源题库后的截图或记录。缺任一类都不能说收藏身份链路完整。证据证明什么重复答案样本文本不再是唯一主键legacy 样本旧收藏不会被误删或伪造来源删除题库样本收藏页不依赖 live deck 才能展示如果只是代码里新增了FavoriteIdentity还没有这些行为证据只能算模型设计完成。收藏取消也要按 identity 处理收藏文章如果只讲新增仍然不完整。取消收藏同样要按FavoriteIdentity删除否则用户取消 deckA 的“再观察一天”可能把 deckB 里同文答案也删掉。asyncfunctionremoveFavorite(identity:FavoriteIdentity):Promisevoid{constrecordsawaitFavoriteRepository.loadAll();constnextrecords.filter((item){if(!(identityinitem)){returntrue;}returnitem.identity.deckId!identity.deckId||item.identity.answerId!identity.answerId;});awaitFavoriteRepository.saveAll(next);AppStorage.setOrCreate(favorite.changedAt,Date.now());}这段删除逻辑故意保留 legacy 记录因为 legacy 没有可靠来源不能被一次新身份取消误伤。验证时要同时做“取消新收藏”和“保留旧收藏”两件事才能证明身份治理没有造成数据丢失。人工评审时看收藏页是否依赖实时题库收藏页应该能在来源题库被删除后继续显示收藏快照。评审时可以先收藏一条答案再删除对应题库然后重进收藏页。若页面空白或崩溃说明它仍然依赖 live deck而不是依赖收藏记录自身。状态收藏页表现允许动作来源题库存在显示答案和题库名可跳转来源查看来源来源题库删除显示答案快照和题库名快照不提供来源跳转legacy 收藏显示答案快照来源未知可删除不参与来源跳转这一步能补足模型之外的体验证据。用户收藏的是“当时有价值的答案”不是一条必须依赖题库存在才能打开的弱引用。小结收藏的身份不能只靠文本。用 deckId 和 answerId 表示来源用文本和题库名作为展示快照再把旧数据标记为 legacy才能同时保护重复答案、来源追踪和删除后的可读性。

相关新闻

最新新闻

洛雪音乐音源终极配置指南:三步实现全网音乐自由

洛雪音乐音源终极配置指南:三步实现全网音乐自由

洛雪音乐音源终极配置指南:三步实现全网音乐自由 【免费下载链接】lxmusic- lxmusic(洛雪音乐)全网最新最全音源 项目地址: https://gitcode.com/gh_mirrors/lx/lxmusic- 想要在洛雪音乐中畅听全网音乐却不知如何配置音源?音源配置是解锁洛雪音乐…

2026/8/1 20:10:36
Qwen图像编辑快速一体化解决方案:4步生成专业AI图片的完整指南

Qwen图像编辑快速一体化解决方案:4步生成专业AI图片的完整指南

Qwen图像编辑快速一体化解决方案:4步生成专业AI图片的完整指南 【免费下载链接】Qwen-Image-Edit-Rapid-AIO 项目地址: https://ai.gitcode.com/hf_mirrors/Phr00t/Qwen-Image-Edit-Rapid-AIO Qwen-Image-Edit-Rapid-AIO是一个革命性的AI图像编辑工具包&…

2026/8/1 20:10:36
3分钟学会Balena Etcher:最安全的SD卡与USB镜像烧录工具

3分钟学会Balena Etcher:最安全的SD卡与USB镜像烧录工具

3分钟学会Balena Etcher:最安全的SD卡与USB镜像烧录工具 【免费下载链接】etcher Flash OS images to SD cards & USB drives, safely and easily. 项目地址: https://gitcode.com/GitHub_Trending/et/etcher 你是否曾经因为误操作而将系统镜像写入错误的…

2026/8/1 20:10:36
低空经济赋能,政策东风加持!全球双转子发动机产业现状与发展趋势解析

低空经济赋能,政策东风加持!全球双转子发动机产业现状与发展趋势解析

一、核心产品概述与行业经营数据双转子发动机是基于汪克尔结构研发的旋转式内燃机,核心由双转子组件、偏心轴、精密密封系统、进排气及电控燃油喷射系统构成,双转子错位布局的设计,可实现动力叠加输出,完美解决单转子发动机功率不…

2026/8/1 20:10:36
Frosted Glass Themes终极指南:从安装到自定义的完整教程

Frosted Glass Themes终极指南:从安装到自定义的完整教程

Frosted Glass Themes终极指南:从安装到自定义的完整教程 【免费下载链接】homeassistant-frosted-glass-themes ✨ Beautiful and modern Theme for Home Assistant 项目地址: https://gitcode.com/gh_mirrors/ho/homeassistant-frosted-glass-themes Fros…

2026/8/1 20:10:36
MATLAB数据导出CSV全攻略:从基础函数到海量数据处理

MATLAB数据导出CSV全攻略:从基础函数到海量数据处理

1. 从数据到文件:为什么CSV是MATLAB数据导出的首选在数据分析、仿真和科研的日常里,我们常常在MATLAB里完成核心计算,得到一堆宝贵的矩阵、表格或结构体。但故事往往不会在MATLAB的命令窗口里结束。你需要把结果交给同事、导入到数据库、用其…

2026/8/1 20:05:35