发布时间:2026/7/21 1:02:56
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 搜索请求乱序怎么办:输入太快时旧结果为什么会覆盖新结果
2026/7/21 1:02:56

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

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

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

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

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

阅读更多
wvp-GB28181-pro技术解析:基于Java虚拟线程的高并发国标视频平台架构设计与性能优化
2026/7/21 1:02:56

wvp-GB28181-pro技术解析:基于Java虚拟线程的高并发国标视频平台架构设计与性能优化

wvp-GB28181-pro技术解析:基于Java虚拟线程的高并发国标视频平台架构设计与性能优化 【免费下载链接】wvp-GB28181-pro 基于GB28181-2016、部标808、部标1078标准实现的开箱即用的网络视频平台。自带管理页面,支持NAT穿透,支持海康、大华、宇…

阅读更多
神经血管“九联防线“:FE/ICAM-1/IL-6/MMP-9/NEFL/PTX3/TNFSF12/TREM2/vWF Luminex Panel构建血脑屏障完整性与神经退行风险评估一体化方案
2026/7/21 13:03:10

神经血管“九联防线“:FE/ICAM-1/IL-6/MMP-9/NEFL/PTX3/TNFSF12/TREM2/vWF Luminex Panel构建血脑屏障完整性与神经退行风险评估一体化方案

——云克隆液相悬浮芯片九联Panel:从铁代谢到内皮损伤、从基质降解到轴突断裂、从小胶质活化到血栓形成——全面覆盖脑血管-神经单元完整性【生物标志物高通量检测专题2026】对神经血管单元(Neurovascular Unit, NVU)的研究,是近十…

阅读更多
填补内分泌研究稀缺空白!武汉云克隆标准化猫肾上腺皮质细胞(ADCC)实现全球供应
2026/7/21 13:03:10

填补内分泌研究稀缺空白!武汉云克隆标准化猫肾上腺皮质细胞(ADCC)实现全球供应

本报讯 针对猫自发性库欣综合征、肾上腺肿瘤、应激内分泌调控研究缺少适配体外大动物模型的行业痛点,武汉云克隆科技股份有限公司正式推出猫肾上腺皮质原代细胞(Feline ADCC,货号 CSI001Fe01)。依托企业持有的湖北省科技厅核发《实…

阅读更多
杰理之外挂FM开启扫频会异常【篇】
2026/7/21 13:03:10

杰理之外挂FM开启扫频会异常【篇】

原因:缺乏设置扫频状态的接口,导致访问异常。

阅读更多
激素调控研究的“核心枢纽”:武汉云克隆推出犬肾上腺皮质细胞(ADCC)原代细胞
2026/7/21 13:03:10

激素调控研究的“核心枢纽”:武汉云克隆推出犬肾上腺皮质细胞(ADCC)原代细胞

肾上腺是人体和动物体内最重要的内分泌器官之一。它分为髓质和皮质两部分——髓质分泌肾上腺素,负责“战或逃”的应急反应;皮质则负责分泌皮质醇、醛固酮和雄激素,调控糖代谢、水盐平衡、应激反应和免疫调节。可以说,肾上腺皮质细…

阅读更多
杰理之外挂FM开启扫频会异常死机【篇】
2026/7/21 13:03:10

杰理之外挂FM开启扫频会异常死机【篇】

原因:缺乏设置扫频状态的接口,导致访问异常。

阅读更多
HarmonyOS 6.0 数据可视化图表
2026/7/21 12:03:05

HarmonyOS 6.0 数据可视化图表

图表是数据展示最直观的方式。HarmonyOS没有内置的图表库(没有echarts那种),图表要么用Canvas自己画,要么用Progress/DataPanel这类简化组件。这篇把柱状图、折线图、饼图、环形图全部用Canvas实现一遍,顺便讲清楚绘图…

阅读更多
噗叽短视频界面分析
2026/7/21 1:15:47

噗叽短视频界面分析

1 和小红书类似,可以采用类似判断方法------------其实他比小红书好判断,因为他没有图片,控件位置几乎是固定的,都不用判断------------2 因为他没有点赞按钮------------而且几乎所有控件位置都是完全一样的,所以我就…

阅读更多
噗叽自动化评论脚本基本完成
2026/7/21 1:23:43

噗叽自动化评论脚本基本完成

整个开发过程,耗时2.5小时:

阅读更多
游戏服务器性能调优:基于 ECS 架构的确定性帧同步与 Go 协程并发模型实践
2026/7/21 1:12:56

游戏服务器性能调优:基于 ECS 架构的确定性帧同步与 Go 协程并发模型实践

游戏服务器性能调优:基于 ECS 架构的确定性帧同步与 Go 协程并发模型实践 一、游戏服务器的性能铁三角:帧率、延迟、并发数 游戏服务器与普通 Web 服务器的性能指标完全不同。Web 服务器关注 QPS 和 P99 延迟,游戏服务器关注帧速率&#xff0…

阅读更多
只会用工具不算黑客,手把手教你写第一个渗透脚本
2026/7/21 0:02:56

只会用工具不算黑客,手把手教你写第一个渗透脚本

从“工具人”到“创造者”:为什么只会用工具不算黑客 在网络安全的学习道路上,很多初学者都会经历一个相似的阶段:手里攥着一堆神器,Burp Suite 抓包改包行云流水,SQLMap 一键注入势如破竹,Nmap 扫描全网段…

阅读更多
北京华恒智信破解景区酒店考核形式主义案例
2026/7/21 0:02:56

北京华恒智信破解景区酒店考核形式主义案例

一、国有文旅集团传统服务考核的核心痛点国有文旅集团旗下涵盖酒店、景区、旅行社等多元业务板块,普遍重视员工服务培训,持续投入大量成本优化服务能力,但在服务考核环节长期存在主观性过强的问题,陷入“凭感觉打分”的管理困境。…

阅读更多
北京华恒智信破解文旅集团薪酬天花板改革案例
2026/7/21 0:02:56

北京华恒智信破解文旅集团薪酬天花板改革案例

工资总额是国有文旅企业的薪酬“天花板”,市场竞争是行业发展的“硬道理”。在国企改革深化提升的大背景下,国有文旅企业薪酬改革的核心难题,是在政策红线约束与市场化人才竞争之间探寻可持续发展路径。如何在固定薪酬总额管控下留住核心人才…

阅读更多
基于Dify与DeepSeek构建私有知识库问答系统实战指南
2026/7/20 0:40:52

基于Dify与DeepSeek构建私有知识库问答系统实战指南

在业务中快速构建一个能理解私有文档、准确回答专业问题的智能助手,是很多开发团队面临的共同挑战。传统方案往往需要从零开始搭建复杂的 RAG(检索增强生成)系统,涉及文档解析、向量化、检索、大模型调用等多个环节,整…

阅读更多
FAE放射组学分析工具:医学影像特征探索的完整解决方案
2026/7/20 0:48:14

FAE放射组学分析工具:医学影像特征探索的完整解决方案

FAE放射组学分析工具:医学影像特征探索的完整解决方案 【免费下载链接】FAE FeAture Explorer 项目地址: https://gitcode.com/gh_mirrors/fae/FAE 你是否曾经面对海量医学影像数据感到无从下手?想要从CT、MRI等影像中提取有价值的定量特征&#…

阅读更多
DesktopNaotu:你的终极离线思维导图解决方案,告别网络依赖!
2026/7/20 0:45:44

DesktopNaotu:你的终极离线思维导图解决方案,告别网络依赖!

DesktopNaotu:你的终极离线思维导图解决方案,告别网络依赖! 【免费下载链接】DesktopNaotu 桌面版脑图 (百度脑图离线版,思维导图) 跨平台支持 Windows/Linux/Mac OS. (A cross-platform multilingual Mind Map Tool) 项目地址:…

阅读更多