首页/新闻资讯/正文详情

羽毛球教程 HarmonyOS 学习应用(03):练习日志的本地记录设计

发布时间:2026/11/7 16:02:06 来源:云帆数科 栏目:资讯中心
羽毛球教程 HarmonyOS 学习应用(03):练习日志的本地记录设计
一、练习记录需要同时满足录入、回看与统计一次羽毛球练习不仅有“做过”这个布尔值还包含日期、持续时间、训练类型、文字记录和自评。页面要支持新增、编辑、批量删除也要即时计算总次数、总时长、本周次数和分类平均评分。练习记录属于结构化列表但当前规模较小、查询规则简单因此采用内存响应状态加 Preferences 持久化。若未来需要上万条记录、多条件检索或跨表统计再迁移到关系型存储。二、PracticeLog 用稳定 id 区分每次训练模型将业务字段和审计时间分开。id不依赖数组位置编辑和删除都可以准确定位同一条记录。export interface PracticeLog { id: string date: string durationMin: number type: string content: string rating: number createdAt: number updatedAt?: number } export const PRACTICE_TYPES: string[] [ 单打对练, 双打对练, 步伐训练, 发球练习, 体能训练, 其他 ]字段约束页面用途dateYYYY-MM-DD周统计与列表展示durationMin正整数总时长type预设类型之一分类聚合content可为空复盘备注rating1–5星级和平均分createdAt/updatedAt毫秒时间戳稳定排序与刷新键三、写入前先复制数组AppStorage中的列表是页面响应状态。直接在原数组上unshift或替换成员可能不能稳定触发依赖该数组的界面更新。服务层先复制再写回完整新数组。private static save(logs: PracticeLog[]): void { AppStorage.setOrCreatePracticeLog[](StorageKeys.PRACTICE_LOGS, logs) PreferencesHelper.get().persist(StorageKeys.PRACTICE_LOGS, logs) } static add(log: PracticeLog): void { const next: PracticeLog[] PracticeLogService.list().slice() next.unshift(log) PracticeLogService.save(next) }同一次save同时更新响应状态和持久化层当前页面立即刷新应用重启后又能恢复。页面不直接调用 Preferences避免各处使用不同键名或序列化格式。Preferences 的键值存储、内存加载与flush行为可参考华为官方 用户首选项持久化指南。练习列表规模增长后应重新评估整份 JSON 读写的成本。四、编辑和删除都通过 id 收敛编辑先复制当前数组再找到相同 id删除则使用过滤生成新数组。找不到待编辑记录时保持原状态不凭空新增重复项。static update(log: PracticeLog): void { const next: PracticeLog[] PracticeLogService.list().slice() const index: number next.findIndex(item item.id log.id) if (index 0) { next[index] log PracticeLogService.save(next) } } static remove(id: string): void { const next PracticeLogService.list().filter(item item.id ! id) PracticeLogService.save(next) }新增记录的 id 由时间与随机片段组合编辑记录保留原createdAt只更新updatedAt。列表的ForEach键包含 id 与更新时间因此内容变化后对应卡片会重新渲染。五、编辑页在提交前归一化输入页面字段只保存用户的临时输入提交时再组装PracticeLog。日期为空、时长不合法或评分越界都应在写入前拦截。const log: PracticeLog { id: existing?.id ?? PracticeLogService.genId(), date: this.date.trim(), durationMin: Number(this.durationText), type: this.type, content: this.content.trim(), rating: this.rating, createdAt: existing?.createdAt ?? Date.now(), updatedAt: existing ? Date.now() : undefined } if (existing) { PracticeLogService.update(log) } else { PracticeLogService.add(log) }页面跳转只携带可选logId。编辑已有记录时用 id 回读新建时没有 id使用默认日期、类型和评分。这样路由参数不会携带一整份可能过期的对象。六、统计值从当前记录重新计算总次数直接取数组长度总时长对durationMin求和平均评分按当前记录计算本周次数则比较每条日期与本周一。删除或编辑后不手工递增、递减多个计数器而是从新数组重新投影。private avgRating(): string { if (this.logs.length 0) return - let sum: number 0 for (const log of this.logs) { sum log.rating } return (sum / this.logs.length).toFixed(1) } private totalMinutes(): number { return this.logs.reduce((sum, log) sum log.durationMin, 0) }这种计算牺牲了极少量遍历成本却消除了“记录删除了总时长没减”“类型改了旧分类仍计数”等同步错误。七、空状态、批量删除与恢复边界首次进入且没有记录时页面显示明确空状态和“开始记录”入口。进入编辑模式后选中项保存在页面局部状态退出编辑模式立即清空避免下一次误删。异常或边界处理方式不允许的结果持久化数据为空返回空数组页面崩溃编辑 id 不存在不写入静默新增重复记录时长不是正数提交前提示写入NaN或负数批量删除未选中隐藏删除操作删除全部Preferences 写入失败保留当前状态并提示重试假装已永久保存当前实现是本地单端模型不应把它描述成云同步。跨设备共享需要额外的账号范围、冲突策略、重试队列和服务端标识。八、运行界面与验收路径现有运行界面验证了练习记录页面的空状态、主标题和新增入口。完整验收按以下顺序进行1. 从空状态新增一条练习返回后列表立即出现。 2. 重启应用记录仍存在且字段完整。 3. 编辑时长与评分统计卡片和分类平均分同步变化。 4. 新增不同类型记录分类统计分别归组。 5. 批量选择两条记录后删除未选中的记录保留。 6. 输入空日期、零时长或越界评分写入被拦截并可继续修正。持久化验收不能只看当前列表。保存后要彻底退出并重新进入应用核对日期、类型、备注、评分与统计是否一致随后编辑同一条记录并再次重启确认只存在一个 idcreatedAt保留而updatedAt变化。批量删除后也要重启验证防止 AppStorage 已删除但 Preferences 仍保留旧数组。若 JSON 解析失败页面应进入可恢复空状态并记录诊断信息不能在后台自动覆盖损坏数据而让排查线索消失。九、小列表也需要明确的数据合同练习日志规模不大但新增、编辑、删除、统计和持久化已经形成完整闭环。把数组复制、统一写入、id 定位和派生统计放进服务边界后页面只负责交互和展示未来迁移关系型存储时也能保持页面模型基本不变。迁移时可先为服务层增加 Repository 接口再把 Preferences 实现替换为关系型实现。页面继续调用新增、更新、删除和查询不感知表结构历史数据通过一次性迁移读取旧 JSON、校验每条字段、批量写入新库全部成功后再写迁移标记。任何一条失败都保留旧数据并允许重试避免半迁移状态。

相关推荐

羽毛球教程 HarmonyOS 学习应用(02):课程模型与分类筛选
羽毛球教程 HarmonyOS 学习应用(02):课程模型与分类筛选

一、两级分类解决什么问题 羽毛球知识既有基础规则、技巧分析、装备详解等大模块,也有发球、击球、步伐、防守等模块内子分类。若页面只维护一串展示文案,课程详情、学习进度、收藏和测验很快会失去共同的业务标识。 应用采用“模块 → 子分类 → 课程”… · 2026/9/11 11:51:11

基于深度学习的电子元器件分类数据集与应用实践
基于深度学习的电子元器件分类数据集与应用实践

1. 项目背景与核心价值 电子元器件分类是工业自动化、智能仓储和PCB检测等领域的基础需求。传统人工分类方式效率低下且容易出错,而基于深度学习的视觉识别技术正在快速改变这一现状。这个数据集的核心价值在于解决了三个关键痛点: 高精度标注 &#x… · 2026/9/21 13:31:23

TI C67x DSP浮点运算性能优化:FastRTS库原理与工程实践
TI C67x DSP浮点运算性能优化:FastRTS库原理与工程实践

1. 项目概述在嵌入式数字信号处理(DSP)的世界里,性能就是一切。尤其是在处理音频流、雷达信号或者实时图像时,一个三角函数或者对数运算慢了那么几微秒,整个系统的实时性就可能崩塌。我接触过不少基于TI C6000系列DSP的… · 2026/8/8 23:13:53

电工证之后考什么科目?考前押题帮你稳过!
电工证之后考什么科目?考前押题帮你稳过!

电工证之后考什么科目?考前押题帮你稳过! 怕考不过白交培训费?电工证之后考什么科目是不少考生心中的疑问,尤其是那些已经拿到低压电工证或高压电工证,准备进一步拓展技能的从业者。其实,考前押题不仅能帮你明确备考方向,还能提高通过率,避免交了钱却… · 2026/11/7 16:01:41

河北住建厅特种工证书怎么考?2026河南最新政策来了
河北住建厅特种工证书怎么考?2026河南最新政策来了

河北住建厅特种工证书怎么考?2026河南最新政策来了 你是不是也遇到过这种情况:想考特种作业证,但不知道去哪报名,怕被中介骗钱?最近我帮一个朋友咨询,他就是商丘的,准备考低压电工证,结果跑了好几家培训机构,不是价格虚高就是证书有问题,差点耽… · 2026/11/7 16:01:41

电工证移民流程怎么走?考前押题帮你稳过实操考试
电工证移民流程怎么走?考前押题帮你稳过实操考试

电工证移民流程怎么走?考前押题帮你稳过实操考试 实操考试心里没底怕挂科?你不是一个人。每次看到电工证考试现场,总有人一脸紧张,尤其是第一次报考的新人,对流程、考试内容、证书作用一知半解,生怕一步走错就前功尽弃。别担心,本文从 信阳浉河区… · 2026/11/7 16:01:41

3000字真实经历:沙河市建筑电工证怎么考?怕考不过白交培训费的看这篇
3000字真实经历:沙河市建筑电工证怎么考?怕考不过白交培训费的看这篇

3000字真实经历:沙河市建筑电工证怎么考?怕考不过白交培训费的看这篇 怕考不过白交培训费?这事儿我真干过。三年前我跟着朋友去考沙河市建筑电工证,培训费花了快2000块,结果考试差了3分,硬生生把钱扔水里了。后来我才知道,原来这证不是谁都能… · 2026/11/7 16:01:41

之前考的证在外省能不能转过来?城阳电工证查询网上查询全流程解析
之前考的证在外省能不能转过来?城阳电工证查询网上查询全流程解析

之前考的证在外省能不能转过来?城阳电工证查询网上查询全流程解析 之前考的证在外省能不能转过来?这是很多电工朋友在考虑转行、换城市或者想在本地执业时最头疼的问题。特别是像 城阳电工证查询… · 2026/11/7 16:01:41

吉林哪里能考电工证,考前押题怎么拿分更稳
吉林哪里能考电工证,考前押题怎么拿分更稳

吉林哪里能考电工证,考前押题怎么拿分更稳 实操考试心里没底怕挂科,这是很多报考电工证的学员最真实的想法。尤其是在吉林,电工证不仅是上岗的通行证,更关系到你未来的职业发展和薪资待遇。很多人在备考前最担心的,就是考试时遇到不会的题目,或者实操环… · 2026/11/7 16:00:41

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/7 11:25:08

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/7 12:02:18

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 10:29:23

澳洲水电工证考试:证书过期了不知道怎么复审延期?电子证书怎么弄?
澳洲水电工证考试:证书过期了不知道怎么复审延期?电子证书怎么弄?

澳洲水电工证考试:证书过期了不知道怎么复审延期?电子证书怎么弄? 证书过期了不知道怎么复审延期?别慌,很多人在拿到【澳洲水电工证考试】的电子证书后,一不小心就忽略了复审时间,结果证书失效,工作受阻,甚至被单位追责。今天就从【澳洲水电工证考试… · 2026/11/7 0:00:41

电工作业提示版通过率揭秘:怎么考才能一次过?
电工作业提示版通过率揭秘:怎么考才能一次过?

电工作业提示版通过率揭秘:怎么考才能一次过? 怕考不过白交培训费?别急,今天我就从驻马店应届工程类毕业生的视角,带你全面了解电工作业提示版的考试流程、备考要点和真实通过率,帮你少走弯路、提高一次通过率。… · 2026/11/7 0:00:41

电工证年审报名千万别踩坑 外省证转过来要搞清这几点
电工证年审报名千万别踩坑 外省证转过来要搞清这几点

电工证年审报名千万别踩坑 外省证转过来要搞清这几点 之前考的证在外省能不能转过来?这个问题是很多电工从业者最关心的,特别是像你这样在商丘从事公路工程的人员,经常需要跨省流动,证书的 有效性 和 可迁移性… · 2026/11/7 0:00:41

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/7 11:25:08

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/7 12:02:18

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 10:29:23

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码