尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
【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 页面保持简洁并为数据库与云同步升级预留空间。
RELATED

相关推荐

UVA10935 - 副本

UVA10935 - 副本

UVA10935 卡片游戏 Throwing cards away I 题目描述 PDF 输入格式 输出格式 输入输出样例 #1 输入 #1 7 19 10 6 0输出 #1 Discarded cards: 1, 3, 5, 7, 4, 2 Remaining card: 6 Discarded cards: 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 4, 8, 12, 16, 2, 10, 18, 14 Remai…

📅 2026/9/12 4:58:13
AI建站工具:零基础10分钟打造专业网站

AI建站工具:零基础10分钟打造专业网站

1. 项目概述:AI建站工具如何让零基础用户10分钟搭建网站 去年帮朋友开甜品店时,我亲眼见证了一个完全不懂代码的烘焙师用AI建站工具,仅用8分37秒就做出了带在线预订功能的网站。这种工具正在颠覆传统建站模式——不再需要学习HTML/CSS&#x…

📅 2026/8/23 17:05:45
嘎嘎降AI:高效论文降重工具使用指南

嘎嘎降AI:高效论文降重工具使用指南

1. 项目概述作为一名经常需要处理学术论文的研究人员,我深知论文降重这个环节的痛点和需求。最近发现了一款名为"嘎嘎降AI"的工具,经过实际测试发现它确实能在短时间内高效完成论文降重工作。今天就来详细分享这个工具的使用方法和技巧。2. 工…

📅 2026/8/23 17:05:45
MORE NEWS

更多资讯

📰

postgres_lsp 安全规则 renamingTable 详解:拦截表重命名风险,守护迁移与线上查询

postgres_lsp 安全规则 renamingTable 详解:拦截表重命名风险,守护迁移与线上查询 【免费下载链接】postgres_lsp A Language Server for Postgres 项目地址: https://gitcode.com/GitHub_Trending/po/postgres_lsp 本指南以 postgres_lsp 项目中…

📰

PyCharm虚拟环境完全指南:从创建到日常开发

先看个真实案例。上周有位读者找我,说他电脑里Python版本是3.9,装了一堆包,后来为了跑一个新项目,装了个要求Python 3.11的库,结果系统被搞得一团糟——原来能跑的脚本报错,pip list乱成一锅粥,…

📰

CMake构建实战:从命令行到缓存机制的核心技巧解析

简介:CMake 开发手册详解 PDF 围绕跨平台构建系统 CMake 展开,面向 C/C 开发者与需要管理多语言、多配置项目的工程人员,从 2.8.3 版本的关键选项到常用命令均有覆盖,可帮助读者快速掌握编写 CMakeLists.txt、借助 Makefile 或 Vi…

📰

Slang 生成式设计文档的审查实践:03-semantic-check 审查报告的机制、发现与源码佐证

Slang 生成式设计文档的审查实践:03-semantic-check 审查报告的机制、发现与源码佐证 【免费下载链接】slang Making it easier to work with shaders 项目地址: https://gitcode.com/GitHub_Trending/sl/slang 本文以 Slang 仓库中的一份真实文档审查报告&a…

📰

Canary vs Canary-Qwen:transcribe.cpp 两大 NVIDIA 模型家族完整横向对比指南

Canary vs Canary-Qwen:transcribe.cpp 两大 NVIDIA 模型家族完整横向对比指南 【免费下载链接】transcribe.cpp ggml speech-to-text inference for 16 model families 项目地址: https://gitcode.com/GitHub_Trending/tr/transcribe.cpp transcribe.cpp 是…

📰

维莫德吉治疗基底细胞癌:缩瘤速度、耐药机制与用药管理全解析

1. 药物原理与临床定位:维莫德吉拿什么对付基底细胞癌1.1 基底细胞癌并不全是“小问题”基底细胞癌是皮肤科和肿瘤科绕不开的最常见皮肤恶性肿瘤,占所有皮肤癌的绝大部分。绝大多数情况下,它的确很温和:长在面部、鼻翼、眼周&…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬