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/10/18 21:15:05 阅读更多 →
HarmonyOS ArkUI 列表刷新为什么会闪:加载态、空态、错误态和旧数据怎么分开

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

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

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

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

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

2026/10/17 13:12:39 阅读更多 →

最新新闻

直流伺服电机电气信号分层解析与示波器调试指南

直流伺服电机电气信号分层解析与示波器调试指南

循环系统建立后,电气信号的观察大局做嵌入式这几年,直流伺服电机是我打交道最多的执行部件之一。你可能会觉得“电信号嘛,无非就是电源线加两根控制线”,可真把示波器探头挂上去,你会看到同时存在功率线、逻辑线、反馈…

2026/10/19 5:58:35 阅读更多 →
1200 PLC与威纶通触摸屏Modbus通讯及步进控制薄图实现

1200 PLC与威纶通触摸屏Modbus通讯及步进控制薄图实现

做自动化项目的人,基本都碰过这种局面:手头是1200 PLC,人机界面却是另一家触摸屏,两条线非要拧到一起,中间还夹着一台步进电机要控制。很多人第一反应是加网关、买通讯模块,结果成本上去了,调试…

2026/10/19 5:58:35 阅读更多 →
artcraft:数字创作中的人为干预范式

artcraft:数字创作中的人为干预范式

1. “Artcraft”不是新词,而是被低估的创作范式重启信号最近在多个设计社区、开源项目讨论区和创意工作坊里,频繁看到“artcraft”这个词被零散使用——不是作为品牌名,也不是某个具体工具的代号,而是一种正在悄然凝聚共识的实践态…

2026/10/19 5:58:35 阅读更多 →
RL78 Data Flash自编程实战:解锁、擦除、写入与掉电保护

RL78 Data Flash自编程实战:解锁、擦除、写入与掉电保护

简介:本资源是面向嵌入式开发工程师与RL78单片机初学者的实操型技术资料包,聚焦数据闪存(Data Flash)访问与Flash自编程(FSL)两大核心功能的IAR集成开发环境落地实现。资源提供完整的库生成工具链、权威用户…

2026/10/19 5:58:35 阅读更多 →
Kokoro 和微软 TTS 怎么选?先分清本地模型与在线服务

Kokoro 和微软 TTS 怎么选?先分清本地模型与在线服务

kokoro-onnx 这个文字转语音工具好不好?我的判断是:如果你希望在自己的电脑上生成语音,它值得试一试。 本地运行、模型较小,是它值得关注的原因。至于声音是否足够好,还要看你使用的语言、文本和具体音色。 微软的语音…

2026/10/19 5:58:35 阅读更多 →
实测五大论文降重方案:AI改写、翻译法、结构重组与规范引用

实测五大论文降重方案:AI改写、翻译法、结构重组与规范引用

1. 2026届毕业季,降重为什么成了“刚需”每年到毕业季,论文查重总是绕不开的话题。2026届的同学们面对的情况其实更加特殊:主流的查重系统在近几年完成了好几次算法迭代,对语义相似度的识别比前几年精准得多,以前那种“…

2026/10/19 5:57:35 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

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

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/18 12:16:16 阅读更多 →