基于HarmonyOS的情侣美食管理应用开发实战(十三)- 修复主页菜谱列表不显示问题 📅 发布时间:2026/7/12 23:00:59 👁️ 浏览次数: 基于HarmonyOS的情侣美食管理应用开发实战一- 修复主页菜谱列表不显示问题问题现象在 HarmonyOS 应用开发过程中遇到了一个奇怪的问题主页我的菜谱模块显示共4个但列表区域完全空白菜谱分类页面点进分类后可以正常显示菜谱列表数据库确认有菜谱数据存在这个问题看起来很矛盾为什么分类页面能显示主页却不能问题分析1. 数据加载流程对比首先对比主页和分类页面的数据加载流程主页加载流程// ChefHomePage.etsasyncloadRecipes(){this.isLoadingtruetry{this.recipesawaitRdbUtil.queryAllRecipes()// 查询所有菜谱LogUtil.info(ChefHomePage,加载完成共${this.recipes.length}个菜谱)}catch(err){LogUtil.error(ChefHomePage,加载菜谱失败:${JSON.stringify(err)})}finally{this.isLoadingfalse}}分类页面加载流程// RecipeTypePage.etsasyncloadRecipes(){this.isLoadingtruetry{this.recipesawaitRdbUtil.queryRecipesByType(this.type)// 按类型查询LogUtil.info(RecipeTypePage,加载完成共${this.recipes.length}个菜谱)}catch(err){LogUtil.error(RecipeTypePage,加载菜谱失败:${JSON.stringify(err)})}finally{this.isLoadingfalse}}2. 数据库查询方法对比检查两个数据库查询方法的实现查询所有菜谱staticasyncqueryAllRecipes():PromiseRecipe[]{constpredicatesnewrelationalStore.RdbPredicates(recipe)predicates.orderByDesc(create_time)constresultSetawaitRdbUtil.rdbStore.query(predicates)constrecipes:Recipe[][]while(resultSet.goToNextRow()){constrecipenewRecipe()recipe.idresultSet.getLong(resultSet.getColumnIndex(id))recipe.nameresultSet.getString(resultSet.getColumnIndex(name))// ... 其他字段recipes.push(recipe)}resultSet.close()returnrecipes}按类型查询菜谱staticasyncqueryRecipesByType(type:number):PromiseRecipe[]{constpredicatesnewrelationalStore.RdbPredicates(recipe)predicates.equalTo(type,type)predicates.orderByDesc(create_time)constresultSetawaitRdbUtil.rdbStore.query(predicates)constrecipes:Recipe[][]while(resultSet.goToNextRow()){constrecipenewRecipe()recipe.idresultSet.getLong(resultSet.getColumnIndex(id))recipe.nameresultSet.getString(resultSet.getColumnIndex(name))// ... 其他字段recipes.push(recipe)}resultSet.close()returnrecipes}3. 发现问题经过仔细对比发现了关键问题queryRecipesByType()方法缺少orderCount字段的读取// queryAllRecipes() 中有这行recipe.orderCountresultSet.getLong(resultSet.getColumnIndex(order_count))// queryRecipesByType() 中缺少这行// recipe.orderCount resultSet.getLong(resultSet.getColumnIndex(order_count))虽然这个字段缺失不应该直接导致列表不显示但它反映了代码的不一致性可能影响后续的数据处理。解决方案方案一统一数据库查询遍历方式首先统一了两个查询方法的遍历方式使用while (resultSet.goToNextRow())// 修改前使用 do-whileif(resultSet.rowCount0){if(resultSet.goToFirstRow()){do{// 读取数据}while(resultSet.goToNextRow())}}// 修改后使用 whilewhile(resultSet.goToNextRow()){// 读取数据}方案二补全缺失字段在queryRecipesByType()方法中补全orderCount字段staticasyncqueryRecipesByType(type:number):PromiseRecipe[]{// ...while(resultSet.goToNextRow()){constrecipenewRecipe()recipe.idresultSet.getLong(resultSet.getColumnIndex(id))recipe.nameresultSet.getString(resultSet.getColumnIndex(name))recipe.typeresultSet.getLong(resultSet.getColumnIndex(type))recipe.descriptionresultSet.getString(resultSet.getColumnIndex(description))recipe.imagePathresultSet.getString(resultSet.getColumnIndex(image_path))recipe.imagerecipe.imagePath recipe.cookingTimeresultSet.getLong(resultSet.getColumnIndex(cooking_time))recipe.difficultyresultSet.getLong(resultSet.getColumnIndex(difficulty))recipe.isFavoriteresultSet.getLong(resultSet.getColumnIndex(is_favorite))recipe.orderCountresultSet.getLong(resultSet.getColumnIndex(order_count))// ✅ 补全recipe.createTimeresultSet.getLong(resultSet.getColumnIndex(create_time))recipe.updateTimeresultSet.getLong(resultSet.getColumnIndex(update_time))recipes.push(recipe)}// ...}技术要点1. HarmonyOS ResultSet 遍历方式HarmonyOS 的ResultSet提供了两种遍历方式方式一使用goToNextRow()while(resultSet.goToNextRow()){// 读取当前行数据}方式二使用goToFirstRow()goToNextRow()if(resultSet.goToFirstRow()){do{// 读取当前行数据}while(resultSet.goToNextRow())}两种方式都是正确的但推荐使用第一种方式代码更简洁。2. 数据模型字段完整性在从数据库读取数据时必须确保所有字段都要读取避免数据不完整字段类型要匹配数据库字段类型要与模型字段类型一致字段名称要对应数据库列名要与getColumnName()参数一致3. 日志调试技巧在数据加载方法中添加详细日志有助于快速定位问题asyncloadRecipes(){LogUtil.info(ChefHomePage,开始加载菜谱列表)this.isLoadingtruetry{this.recipesawaitRdbUtil.queryAllRecipes()LogUtil.info(ChefHomePage,加载完成共${this.recipes.length}个菜谱)}catch(err){LogUtil.error(ChefHomePage,加载菜谱失败:${JSON.stringify(err)})}finally{this.isLoadingfalse}}经验总结1. 代码一致性的重要性相同功能的方法应该保持一致queryAllRecipes()和queryRecipesByType()应该使用相同的实现模式避免遗漏字段所有查询方法都应该读取完整的字段列表定期代码审查及时发现和修复不一致的地方2. 调试思路遇到类似问题时可以按照以下步骤调试对比正常和异常场景分类页面能显示主页不能显示检查数据加载流程对比两个页面的数据加载方法检查数据库查询对比两个查询方法的实现检查字段完整性确保所有字段都被正确读取添加日志输出在关键位置添加日志跟踪数据流3. HarmonyOS 开发注意事项ResultSet 必须关闭使用完毕后要调用resultSet.close()异步操作要 await数据库查询是异步操作要正确使用await错误处理要完善使用 try-catch 捕获异常避免应用崩溃最终代码修复后的queryRecipesByType()方法staticasyncqueryRecipesByType(type:number):PromiseRecipe[]{if(!RdbUtil.rdbStore){LogUtil.error(RdbUtil.TAG,数据库未初始化)return[]}try{constpredicatesnewrelationalStore.RdbPredicates(recipe)predicates.equalTo(type,type)predicates.orderByDesc(create_time)constresultSetawaitRdbUtil.rdbStore.query(predicates)constrecipes:Recipe[][]while(resultSet.goToNextRow()){constrecipenewRecipe()recipe.idresultSet.getLong(resultSet.getColumnIndex(id))recipe.nameresultSet.getString(resultSet.getColumnIndex(name))recipe.typeresultSet.getLong(resultSet.getColumnIndex(type))recipe.descriptionresultSet.getString(resultSet.getColumnIndex(description))recipe.imagePathresultSet.getString(resultSet.getColumnIndex(image_path))recipe.imagerecipe.imagePath recipe.cookingTimeresultSet.getLong(resultSet.getColumnIndex(cooking_time))recipe.difficultyresultSet.getLong(resultSet.getColumnIndex(difficulty))recipe.isFavoriteresultSet.getLong(resultSet.getColumnIndex(is_favorite))recipe.orderCountresultSet.getLong(resultSet.getColumnIndex(order_count))recipe.createTimeresultSet.getLong(resultSet.getColumnIndex(create_time))recipe.updateTimeresultSet.getLong(resultSet.getColumnIndex(update_time))recipes.push(recipe)}resultSet.close()returnrecipes}catch(err){LogUtil.error(RdbUtil.TAG,按类型查询菜谱失败:${err})return[]}}测试验证修复后需要验证以下功能✅主页我的菜谱能正常显示所有菜谱✅菜谱分类页面能正常显示各分类的菜谱✅菜谱数量显示数量与实际数量一致✅菜谱详情能正常查看菜谱详细信息结语这个问题看似简单但暴露了代码一致性的重要性。在开发过程中我们应该保持代码风格一致相同功能的方法使用相同的实现模式定期代码审查及时发现和修复不一致的地方完善测试覆盖确保所有功能都经过充分测试重视日志输出在关键位置添加日志方便问题定位希望这篇博客能帮助遇到类似问题的开发者快速定位和解决问题
Creative View Pager深度解析:10个高级定制技巧与最佳实践 Creative View Pager深度解析:10个高级定制技巧与最佳实践 【免费下载链接】creative-viewpager Creative View Pager easy to use in Android 项目地址: https://gitcode.com/gh_mirrors/cr/creative-viewpager Creative View Pager是一个功能强大的Android… 2026/7/12 22:58:58
WebSocket 异常处理最佳实践:基于 gh_mirrors/webso/websocket-client 的完整指南 [特殊字符] WebSocket 异常处理最佳实践:基于 gh_mirrors/webso/websocket-client 的完整指南 🚀 【免费下载链接】websocket-client 🔧 .NET/C# websocket client library 项目地址: https://gitcode.com/gh_mirrors/webso/websocket-client 在实… 2026/7/12 22:58:58
YOLO11 改进 - 特征融合 | SMMM结构感知多尺度掩码模块,筛除冗余、强化边界与语义交互,助力图像分割高效涨点 | AAAI 2026 前言 本文介绍了结构感知多尺度掩码模块——SMMM,用于优化编码器与解码器之间的特征融合。该方法通过多尺度深度可分离卷积捕获不同感受野下的边缘、纹理与结构信息,并利用结构显著性掩码对关键区域进行自适应筛选,抑制背景噪声与冗余特征。… 2026/7/12 22:58:58
从零到日均10万曝光:用AI Agent重构社交媒体工作流,3个关键指标提升300% 更多请点击: https://kaifayun.com 第一章:从零到日均10万曝光:AI Agent驱动的社交媒体增长全景图 在信息过载的社交媒体生态中,传统内容运营正遭遇流量瓶颈与用户注意力碎片化的双重挑战。AI Agent不再仅是自动化工具࿰… 2026/7/13 0:23:24
构建你的思想“金曲专辑”:技术人清晰表达复杂想法的3个框架 作为技术创始人、架构师或独立开发者,你大概率经历过这种场景:在投资人路演上,你需要把分布式系统的最终一致性权衡讲给非技术背景的听众;在团队架构评审或线上故障复盘会上,关键设计决策卡在喉咙里,说出来… 2026/7/13 0:15:23
176.离散产线通用分拣功能块:黑白物料分类、传送带启停联锁、故障自锁,包装 / 物流流水线直接移植 摘要 可编程逻辑控制器(PLC)是现代工业自动化的核心设备,广泛应用于生产线控制、过程监控与离散制造场景。本文从PLC的基本原理出发,深入解析其扫描周期、I/O映射与梯形图/ST语言编程模型,并通过一个完整的物料分拣系统案例,提供可直接运行的ST语言代码与仿真验证步骤。… 2026/7/13 0:13:23
174.带超时故障报警、双推杆互锁保护、自动计数功能的 PLC 状态机分拣程序开发 摘要 可编程逻辑控制器(PLC)是工业自动化领域的核心控制设备,广泛应用于制造业、能源、交通等行业。本文从工程实践角度出发,系统阐述PLC的工作原理、IEC 61131-3编程标准、典型应用场景,并提供完整的梯形图与结构化文本代码示例。通过本文,读者将掌握PLC的硬件架构、扫… 2026/7/13 0:13:23
基于深度学习的蘑菇或花卉或动漫人物或中草药货水果蔬菜等识别系统31(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_ 基于深度学习的蘑菇或花卉或动漫人物或中草药货水果蔬菜等识别系统31(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_ 独家界面!不会重复,此项目属于本人原创,若有雷同,均是盗卖,各位买… 2026/7/13 0:05:20
语音转文字工具AsrTools:让音频整理变得简单高效 语音转文字工具AsrTools:让音频整理变得简单高效 【免费下载链接】AsrTools ✨ AsrTools: Smart Voice-to-Text Tool | Efficient Batch Processing | User-Friendly Interface | No GPU Required | Supports SRT/TXT Output | Turn your audio into accurate text … 2026/7/13 0:03:19
HS2-HF Patch终极指南:如何用3步解决Honey Select 2的70+个痛点 HS2-HF Patch终极指南:如何用3步解决Honey Select 2的70个痛点 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 你是否曾经在Honey Select 2中遇到过… 2026/7/13 0:01:19
语音转文字工具AsrTools:让音频整理变得简单高效 语音转文字工具AsrTools:让音频整理变得简单高效 【免费下载链接】AsrTools ✨ AsrTools: Smart Voice-to-Text Tool | Efficient Batch Processing | User-Friendly Interface | No GPU Required | Supports SRT/TXT Output | Turn your audio into accurate text … 2026/7/13 0:03:19
基于深度学习的蘑菇或花卉或动漫人物或中草药货水果蔬菜等识别系统31(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_ 基于深度学习的蘑菇或花卉或动漫人物或中草药货水果蔬菜等识别系统31(设计源文件万字报告讲解)(支持资料、图片参考_相关定制)_ 独家界面!不会重复,此项目属于本人原创,若有雷同,均是盗卖,各位买… 2026/7/13 0:05:20
Git reset 与 revert 深度对比:5个关键差异与 3 种典型应用场景 Git Reset 与 Revert 深度对比:5个关键差异与3种典型应用场景在团队协作开发中,代码版本管理如同行走钢丝——一步失误可能导致整个项目陷入混乱。作为Git进阶用户,你是否曾在深夜面对错误的提交束手无策?是否在强制推送后收到同事… 2026/7/12 0:01:13
GitHub 学生包申请避坑:5个常见失败原因与开发者工具调试方案 GitHub 学生包申请技术排障指南:5个高频失败场景与开发者工具实战方案第一次尝试申请GitHub学生包时,我盯着屏幕上那个不断转圈的加载动画整整15分钟,最终只等来了一行冰冷的错误提示。这可能是许多开发者共同的经历——明明按照教程操作&… 2026/7/12 0:01:13
冒烟测试用例设计规范:5%-10%覆盖率下的3类核心场景与执行标准 冒烟测试用例设计的黄金法则:5%-10%覆盖率下的精准筛选策略在快节奏的敏捷开发环境中,冒烟测试作为质量保障的第一道防线,其重要性不言而喻。当测试资源有限而时间紧迫时,如何从海量测试用例中精准筛选出那关键的5%-10%࿰… 2026/7/12 0:03:14