HarmonyOS RDB 多条件查询怎么写:分类、关键词和排序条件为什么不要直接拼 SQL 字符串
HarmonyOS RDB 多条件查询怎么写分类、关键词和排序条件为什么不要直接拼 SQL 字符串先把问题说清楚本地 RDB 查询一开始只有一个关键词直接拼字符串好像也能跑。等后面加分类、收藏、最近浏览、排序字段SQL 就会变得很难维护。这个问题表面上看是 UI 小毛病实际上多半是状态边界没有拆清楚。页面里同时有“正在加载”“已有旧数据”“新请求结果”“空状态”“错误状态”如果全部塞进一个布尔值里后面一定会乱。这篇只讲一个可复现问题RDB 多条件查询。我会先写一个容易出错的版本再写一个更稳的版本最后给出检查方法。环境和验证目标项说明技术方向HarmonyOS / ArkUI / ArkTS页面模型Stage 模型页面关注点RDB 多条件查询验证目标操作顺序变化时页面状态仍然可预测适用场景搜索页、筛选页、列表页、详情页返回刷新错误写法只用一个状态硬撑先看一个很常见的写法。代码短但后面排查很难。Entry Component struct BadCasePage { State loading: boolean false; State keyword: string ; State list: string[] []; State errorText: string ; private async reload() { this.loading true; this.errorText ; try { const result await this.mockRequest(this.keyword); this.list result; } catch (err) { this.errorText 加载失败; this.list []; } this.loading false; } private async mockRequest(keyword: string): Promisestring[] { return new Promise((resolve) { setTimeout(() resolve(keyword ? [keyword 结果] : []), 600); }); } build() { Column({ space: 12 }) { Search({ value: this.keyword, placeholder: 输入关键词 }) .onChange((value: string) { this.keyword value; this.reload(); }) if (this.loading) { Text(加载中) } else if (this.errorText.length 0) { Text(this.errorText) } else if (this.list.length 0) { Text(没有结果) } else { ForEach(this.list, (item: string) { Text(item).fontSize(16) }, (item: string) item) } } .padding(16) } }这段代码能跑但它有几个隐患- 请求慢一点时旧请求可能覆盖新请求- 空状态和加载状态挤在一起页面会闪- 错误后再搜索旧错误文案可能残留- 列表清空太早用户会看到内容突然消失。稳一点的拆法把页面状态拆成模型我的做法是把页面状态拆成明确的模型。不要让 loading、error、list 到处散着改。type PagePhase idle | loading | success | empty | error; class PageStateT { phase: PagePhase idle; data: T[] []; errorText: string ; requestVersion: number 0; startRequest(): number { this.phase loading; this.errorText ; this.requestVersion 1; return this.requestVersion; } applySuccess(version: number, data: T[]) { if (version ! this.requestVersion) { return; } this.data data; this.phase data.length 0 ? success : empty; } applyError(version: number, message: string) { if (version ! this.requestVersion) { return; } this.errorText message; this.phase error; } }这里的关键是 coderequestVersion/code。每次请求开始都拿一个版本号返回时只允许最新版本写回页面。这样输入很快时旧请求就不会覆盖新结果。把模型放回 ArkUI 页面Observed class RecipeSearchState extends PageStatestring {} Entry Component struct BetterCasePage { State keyword: string ; State state: RecipeSearchState new RecipeSearchState(); private async reload() { const version this.state.startRequest(); try { const result await this.mockRequest(this.keyword); this.state.applySuccess(version, result); } catch (err) { this.state.applyError(version, 加载失败请稍后再试); } } private async mockRequest(keyword: string): Promisestring[] { return new Promise((resolve) { setTimeout(() resolve(keyword ? [keyword 结果] : []), 600); }); } Builder buildContent() { if (this.state.phase loading) { LoadingProgress() } else if (this.state.phase error) { Text(this.state.errorText).fontColor(#C0372B) } else if (this.state.phase empty) { Text(没有匹配结果可以换个关键词) } else { ForEach(this.state.data, (item: string) { Text(item).fontSize(16).padding(12) }, (item: string) item) } } build() { Column({ space: 12 }) { Search({ value: this.keyword, placeholder: 输入关键词 }) .onChange((value: string) { this.keyword value; this.reload(); }) this.buildContent() } .padding(16) } }这种写法比一个 loading 变量长一点但排查问题更直接。页面到底是加载中、空结果、成功还是失败看 codephase/code 就够了。案例二排序字段必须白名单where 条件可以用参数数组但排序字段不能直接接收外部输入。我会用白名单把排序类型映射成固定字段避免把未知字符串塞进 SQL。class QueryGuard { private currentVersion: number 0; next(): number { this.currentVersion 1; return this.currentVersion; } isLatest(version: number): boolean { return version this.currentVersion; } } Component struct GuardUsagePage { State guard: QueryGuard new QueryGuard(); State text: string ; private async runTask(keyword: string) { const version this.guard.next(); const result await this.remoteSearch(keyword); if (!this.guard.isLatest(version)) { return; } this.text result; } private async remoteSearch(keyword: string): Promisestring { return new Promise((resolve) { setTimeout(() resolve(结果 keyword), 300); }); } }这个小封装适合放到搜索、筛选、分页加载这些位置。只要有“后发请求应该覆盖先发请求”的场景就可以用。怎么验证没有写虚我会按这几步测1. 连续快速输入三个关键词看最后显示的是不是最后一个关键词的结果。2. 输入不存在的关键词看页面是否进入 empty而不是一直 loading。3. 模拟请求失败看错误文案出现后再次搜索是否能恢复。4. 切换筛选条件后看分页和旧列表是否被正确重置。5. 重复进入页面确认没有旧错误、旧空状态残留。如果这几步都过说明这套状态边界是能经得起操作顺序变化的。我会怎么选方案简单页面可以直接用 loading、list、errorText 三个状态不必上来就封装模型。但只要页面出现搜索、防抖、筛选、分页、错误重试我就会把状态收进一个模型里。原因很简单页面越复杂越不能让状态到处散着改。后面如果要复用可以把 codePageState/code 和 codeQueryGuard/code 单独抽出来。不同页面只需要换数据类型和请求方法状态流转还是同一套。

相关新闻

HarmonyOS ArkTS 搜索请求乱序怎么办:输入太快时旧结果为什么会覆盖新结果

HarmonyOS ArkTS 搜索请求乱序怎么办:输入太快时旧结果为什么会覆盖新结果

HarmonyOS ArkTS 搜索请求乱序怎么办:输入太快时旧结果为什么会覆盖新结果 先把问题说清楚 搜索页最烦人的问题不是请求失败,而是请求成功了但结果不对。用户输入“红烧牛”,最后页面却显示“红”的结果,本质就是旧请求晚返回后覆…

2026/7/21 1:00:51 阅读更多 →
HarmonyOS ArkUI 列表刷新为什么会闪:加载态、空态、错误态和旧数据怎么分开

HarmonyOS ArkUI 列表刷新为什么会闪:加载态、空态、错误态和旧数据怎么分开

HarmonyOS ArkUI 列表刷新为什么会闪:加载态、空态、错误态和旧数据怎么分开先把问题说清楚 列表刷新时最常见的问题,是用户刚输入关键词,列表马上清空,然后加载一结束又显示新结果。网速慢一点时,页面会在“旧数据、加…

2026/7/21 1:00:51 阅读更多 →
小程序毕设选题推荐:基于 SpringBoot 的匿名投票管理系统的设计与实现 多场景在线投票评选服务小程序的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】

小程序毕设选题推荐:基于 SpringBoot 的匿名投票管理系统的设计与实现 多场景在线投票评选服务小程序的设计与实现【附源码、mysql、文档、调试+代码讲解+全bao等】

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/21 0:59:50 阅读更多 →

最新新闻

Bid2X:基础模型如何革新广告竞价建模

Bid2X:基础模型如何革新广告竞价建模

1. 项目概述Bid2X这个项目名称本身就很有意思——"Bid"代表竞价,"2X"暗示着双倍的效能提升。作为广告技术领域的老兵,我第一眼看到这个标题就意识到,这可能是近年来广告竞价建模领域最具突破性的尝试之一。广告竞价环境建…

2026/7/22 5:36:54 阅读更多 →
开发效率瓶颈解析:从环境配置到自动化部署的实战优化

开发效率瓶颈解析:从环境配置到自动化部署的实战优化

1. 从这张图看懂全球开发者最近在忙什么这张图最近在技术社区流传很广,表面看是程序员日常状态,但仔细拆开能发现不少实际项目里的典型问题。我一般会先看几个关键点:开发环境是不是卡在依赖安装、调试过程有没有陷入循环、协作时沟通成本高不…

2026/7/22 5:36:54 阅读更多 →
电商智能补货系统:基于Coze平台的库存优化方案

电商智能补货系统:基于Coze平台的库存优化方案

1. 项目概述:Connector的智能补货革命电商运营中最让人头疼的库存管理问题,往往不是数据缺失,而是数据过载后的决策瘫痪。想象这样一个场景:你的Shopify后台同步着TikTok店铺的实时销售数据,每天新增数百条交易记录&am…

2026/7/22 5:36:54 阅读更多 →
嵌入式系统中断与EDMA事件映射机制深度解析与实战配置

嵌入式系统中断与EDMA事件映射机制深度解析与实战配置

1. 嵌入式中断与EDMA事件映射机制深度解析在嵌入式系统开发,尤其是基于复杂多核SoC(如TI的OMAP-L138、AM335x等系列)的项目中,中断和直接内存访问(DMA)是构建高效、实时系统的两大基石。很多工程师在拿到芯…

2026/7/22 5:36:54 阅读更多 →
OpenAI兼容API企业级集成:从环境配置到生产部署实战

OpenAI兼容API企业级集成:从环境配置到生产部署实战

在实际开发中接入 OpenAI 或兼容其 API 格式的服务时,很多团队会遇到依赖缺失、网络限制、配置错误和本地调试困难等问题。特别是当项目需要在内网环境运行,或者服务商要求特定路由才能正常调用时,从零开始搭建一个稳定可用的开发调试环境会涉…

2026/7/22 5:36:54 阅读更多 →
技术栈对应:Vue (前端) + SpringBoot (Java 后端) =》 Python 全场景配套

技术栈对应:Vue (前端) + SpringBoot (Java 后端) =》 Python 全场景配套

一、定位区分Vue:前端页面,负责页面展示、交互SpringBoot:Java 后端服务,接口、业务、数据库Python:全能型,分四大主流使用方向,替代 / 搭配 SpringBoot二、Python 对应后端框架(对标…

2026/7/22 5:35:53 阅读更多 →

日新闻

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

TI DSP系统配置模块SYSCFG详解:中断机制与主设备优先级配置实战

1. 项目概述与SYSCFG模块的核心价值在嵌入式系统,尤其是像TI C6000系列这样的高性能DSP开发中,我们常常会与芯片手册里那些密密麻麻的寄存器打交道。很多开发者可能更关注算法实现、内存优化或者外设驱动,但对于一个稳定、高效的系统而言&…

2026/7/22 0:00:26 阅读更多 →
微信Server酱:高到达率的应急通知方案实践

微信Server酱:高到达率的应急通知方案实践

1. 为什么我们需要"最次"的通知方案? 在数字化协作环境中,消息通知系统的重要性不言而喻明。但现实情况是,企业级通知方案往往需要复杂的API对接(如企业微信、钉钉、飞书),个人开发者的小项目又经…

2026/7/22 0:00:26 阅读更多 →
甲方要的“简洁“PPT,到底是简洁还是省事?

甲方要的“简洁“PPT,到底是简洁还是省事?

甲方说"简洁一点",乙方听到的是"少做几页"。甲方说"不要太复杂",乙方理解成"别放图表了"。结果交过去,甲方说"我说的简洁不是这个意思"。"简洁"这个词在PPT语境里,是…

2026/7/22 0:00:26 阅读更多 →

周新闻

Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/21 8:48:31 阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 5:34:47 阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/21 8:25:39 阅读更多 →

月新闻