【OpenHarmony/HarmonyOs 】本地收藏管理实战:ArkTS Service 层实现网址 CRUD 与容错解析
【OpenHarmony/HarmonyOs 】本地收藏管理实战ArkTS Service 层实现网址 CRUD 与容错解析前言当应用允许用户添加收藏后问题就不再只是“把数组显示出来”。我们还要处理空标题、非法链接、重复 URL、旧版本脏数据、排序规则和异常反馈。本文通过EntryManageService展示如何在 ArkTS 中构建一个职责清晰的本地 CRUD 服务。️一、为什么要有 Service 层如果添加、删除、校验和 JSON 解析都写在页面中会出现三个问题多个页面重复规则行为逐渐不一致UI 与数据存储强耦合未来难以迁移 Cloud DB业务逻辑只能通过 UI 测试单元测试成本很高。Service 层让页面只表达意图const service EntryManageService.getInstance(); this.customSites await service.addCustomSite(title,url);至于如何校验、排序和持久化由服务内部负责。二、单例服务与依赖exportclassEntryManageService{privatestaticinstance: EntryManageService;privatestorage: StorageUtil StorageUtil.getInstance();privateconstructor(){}staticgetInstance(): EntryManageService {if(!EntryManageService.instance) { EntryManageService.instance newEntryManageService(); }returnEntryManageService.instance; } }这个服务当前依赖 Preferences。进一步工程化时可以定义SiteRepository接口并注入实现使本地仓库与云仓库可替换。三、读取数据时永远不要信任磁盘内容Preferences 中保存的是 JSON 字符串。应用升级、手动调试或异常中断都可能留下非法数据所以读取过程需要两层防御安全解析和字段规范化。privatesafeParseArray(json:string):Object[] {if(!json)return[];try{constparsed JSON.parse(json)asObject;returnArray.isArray(parsed) ? parsedasObject[] : []; }catch{return[]; } }解析为数组并不代表元素合法还要逐项验证private normalizeUrlItem(raw:Object): UrlItem |null{constitem rawasRawUrlItem;constid typeofitem.id string?item.id:;consttitle typeofitem.title string? item.title.trim() :;consturltypeofitem.url string?this.normalizeHttpsUrl(item.url) :null;if(!id || !title || !url)returnnull;return{ id, title,url,categoryId: item.categoryId ||custom,sort:typeofitem.sort number?item.sort:0,createdAt:typeofitem.createdAt number?item.createdAt:0,updatedAt:typeofitem.updatedAt number?item.updatedAt:0}; }无效项被丢弃缺失的可选字段获得默认值。这能防止一个坏对象让整个收藏页崩溃。四、新增校验、去重、生成元数据asyncaddCustomSite(titleRaw:string,urlRaw:string):PromiseUrlItem[] {consttitle titleRaw.trim();consturlthis.normalizeHttpsUrl(urlRaw);if(!title)thrownewError(EMPTY_TITLE);if(!url)thrownewError(INVALID_URL);constlistawaitthis.listCustomSites();if(list.some(item item.url url)) {thrownewError(DUPLICATE_URL); }constnow Date.now();constnewItem: UrlItem {id:now.toString(), title,url,categoryId:custom,sort:0,createdAt: now,updatedAt: now };constnext [newItem, ...list];awaitthis.persistCustomSites(next);returnnext; }服务返回更新后的数组页面可以一次性替换State触发声明式 UI 刷新。错误使用稳定代码而不是完整中文文案页面可根据场景决定 AlertDialog、Toast 或表单行内提示。时间戳作为 ID 对单机原型足够直观但极端情况下同一毫秒可能冲突。生产项目建议使用 UUID 或由数据库生成主键。五、更新时保留不可变字段更新接口接收 Patch让调用者只传变化部分exportinterfaceUrlItemPatch { title?:string; url?:string; categoryId?:string; sort?:number; }更新后保留原id和createdAt只刷新updatedAt。如果 URL 发生变化还要排除当前记录后再检查重复const duplicate list.some(itemitem.id!iditem.url nextUrl );if(duplicate) throw new Error(DUPLICATE_URL);这是 CRUD 中很常见却容易遗漏的细节。六、删除与排序语义asyncremoveCustomSite(idRaw:string):PromiseUrlItem[] {constid idRaw.trim();if(!id)thrownewError(INVALID_ID);constlist awaitthis.listCustomSites();constnext list.filter(itemitem.id! id);awaitthis.persistCustomSites(next);returnnext; }当前实现对不存在的 ID 采用幂等删除结果仍是成功状态。这对于用户快速重复点击、重试或未来云同步都很友好。读取后按updatedAt降序同一时间再按标题排序能够保证显示结果稳定。稳定排序很重要否则列表可能在每次刷新时随机跳动。七、本地搜索的权重策略Service 为自定义网址提供加权搜索标题前缀 20 分、URL 前缀 10 分、标题包含 5 分、URL 包含 3 分。规则虽然简单却比单纯过滤更符合用户预期。更大规模时可以继续增加拼音首字母访问频率加分最近使用衰减标签匹配用户固定排序优先。八、存储方案的演进边界JSON Preferences 适合 MVP但每次修改都要读写整份数组。当数据量、并发和查询复杂度上升时应迁移PreferencesJSON↓ 数据量增加 ArkData RDB离线结构化查询 ↓ 多设备同步 本地 RDB AGCCloudDB 冲突合并由于页面只依赖 Service替换底层仓库时页面代码可以基本不动这正是分层设计的价值。✅九、总结可靠的收藏功能来自一组明确规则输入先清洗、URL 强制 HTTPS、写入前去重、读取时容错、更新时间可追踪、错误码保持稳定。将这些规则集中到 Service 层可以让 ArkUI 页面保持简洁并为数据库与云同步升级预留空间。

相关新闻

TurboQuant算法:bit级无损量化技术解析与应用

TurboQuant算法:bit级无损量化技术解析与应用

1. TurboQuant算法技术解析TurboQuant算法的核心突破在于实现了bit级别的无损量化,这不同于传统的8-bit或4-bit量化方法。传统量化通常会导致精度损失,而TurboQuant通过创新的权重分组和动态范围调整技术,在保持模型精度的同时实现了显著的加…

2026/7/23 15:48:56 阅读更多 →
华为手机恢复出厂设置全指南与常见问题解决

华为手机恢复出厂设置全指南与常见问题解决

1. 华为手机恢复出厂设置的必要性与适用场景当你的华为手机出现系统卡顿、存储空间不足、应用频繁崩溃或准备转手出售时,恢复出厂设置往往是最彻底的解决方案。我在过去三年间实测了华为Mate 40 Pro/P50 Pro/Mate 60等多款机型,发现90%的软件问题都能通过…

2026/7/22 9:04:30 阅读更多 →
LangChain:大语言模型集成框架的核心技术与应用

LangChain:大语言模型集成框架的核心技术与应用

1. LangChain的崛起背景与技术定位2023年被称为AI应用爆发元年,当ChatGPT引爆全球对大语言模型(LLM)的关注时,开发者们很快发现一个关键矛盾:强大的基础模型与实际业务需求之间存在巨大鸿沟。这正是LangChain诞生的历史…

2026/7/22 20:33:03 阅读更多 →

最新新闻

AI编程团队四大核心组件解析与实践

AI编程团队四大核心组件解析与实践

1. 项目概述:AI编码团队的四大核心组件 2026年的AI编程领域已经形成了成熟的工具链分工体系,Codex、Cursor、MCP和Harness这四个核心组件构成了现代AI编码团队的技术骨架。作为全程参与多个AI编程项目落地的实践者,我观察到这套技术组合正在重…

2026/7/23 15:48:28 阅读更多 →
OpenClaw记忆增强方案:基于向量化存储与语义检索的优化实践

OpenClaw记忆增强方案:基于向量化存储与语义检索的优化实践

1. OpenClaw记忆增强方案解析最近在折腾OpenClaw的记忆模块时,发现原生方案确实存在不少痛点。本地存储不仅容量有限,跨设备同步更是奢望。实测下来,单次对话超过20轮后,关键信息就开始丢失。直到尝试了阿里云的Agentic Memory AP…

2026/7/23 15:48:28 阅读更多 →
大模型时代下事件抽取技术的核心价值与落地实践

大模型时代下事件抽取技术的核心价值与落地实践

1. 大模型浪潮下的事件抽取技术定位当ChatGPT等大模型以"全能选手"姿态横扫AI领域时,很多传统NLP任务似乎正在被边缘化。但从业者会发现,在金融风控、司法文书分析、医疗事件追踪等专业场景中,大模型直接处理事件抽取任务时&#x…

2026/7/23 15:48:28 阅读更多 →
深入解析Tiva™ EPI接口时序与配置:从原理到SRAM/SDRAM实战

深入解析Tiva™ EPI接口时序与配置:从原理到SRAM/SDRAM实战

1. 项目概述如果你正在使用TI的Tiva™ TM4C129DNCPDT这类基于ARM Cortex-M4的高性能微控制器,并且项目里需要连接外部SRAM、SDRAM、并行LCD或者FPGA,那么你肯定绕不开它的EPI模块。EPI,全称External Peripheral Interface,中文常叫…

2026/7/23 15:48:28 阅读更多 →
Visual Studio连接MySQL的ODBC配置与C++实践指南

Visual Studio连接MySQL的ODBC配置与C++实践指南

1. 环境准备与工具选型 在开始连接Visual Studio和MySQL之前,我们需要确保所有必要的软件组件都已正确安装和配置。这个环节往往是最容易出问题的部分,特别是对于初学者而言。 1.1 软件版本匹配原则 我强烈建议采用"64位一致性"原则&#xf…

2026/7/23 15:48:28 阅读更多 →
C++模式识别实战:分类与聚类算法源码解析与工程实现

C++模式识别实战:分类与聚类算法源码解析与工程实现

1. 项目概述:从源码到实战,构建模式识别工具箱 最近在整理硬盘,翻出来一堆以前做项目时写的C代码,其中有一个文件夹专门存放着各种模式识别算法的实现。从最基础的KNN分类到复杂的谱聚类,从单机版的K-Means到支持多线程…

2026/7/23 15:47:23 阅读更多 →

日新闻

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表)

更多请点击: https://intelliparadigm.com 第一章:从单点好评到指数级传播:AI副业主理人必须掌握的4层口碑渗透模型(含ROI测算表) 当AI副业主理人不再仅满足于单次服务交付,而是主动构建可复用、可裂变、可…

2026/7/23 0:00:25 阅读更多 →
AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析

更多请点击: https://codechina.net 第一章:AI写作开头钩子设计:为什么你的AI文案完读率不足18%?——基于2,346篇A/B测试报告的归因分析 在对2,346篇跨行业AI生成文案的A/B测试数据进行聚类分析后,我们发现&#xff1…

2026/7/23 0:01:26 阅读更多 →
Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具

Chitchatter完整指南:免费开源的终极点对点安全聊天工具 【免费下载链接】chitchatter Secure peer-to-peer chat that is serverless, decentralized, and ephemeral 项目地址: https://gitcode.com/gh_mirrors/ch/chitchatter Chitchatter是一款革命性的安…

2026/7/23 0:01:26 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/7/22 12:54:44 阅读更多 →

月新闻