尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
HarmonyOS开发实战:笔友-持久化升级——从 AppStorage 迁移到 @kit.ArkData 关系型存储
前言在 xiexin 当前架构中数据存储在 AppStorage 中应用重启后数据丢失。如果要落地为真实产品需要引入kit.ArkData关系型数据库RDB实现数据持久化。本文将以DataStore.ets为蓝本详细剖析从 AppStorage 迁移到 ArkData 关系型存储的方案包括relationalStore.getRdbStore创建数据库、CREATE TABLE建表 SQL、bucket.insert()/query()CRUD 操作以及store.beginTransaction()事务管理。一、创建数据库import{relationalStore}fromkit.ArkData;import{context}fromkit.AbilityKit;constCREATE_LETTERS_TABLECREATE TABLE IF NOT EXISTS letters ( id INTEGER PRIMARY KEY AUTOINCREMENT, penPalId INTEGER NOT NULL, penPalName TEXT NOT NULL, honorific TEXT, body TEXT NOT NULL, closing TEXT, signature TEXT, isSender INTEGER DEFAULT 0, status INTEGER DEFAULT 0, wordCount INTEGER DEFAULT 0, createdAt INTEGER NOT NULL );asyncfunctioninitDatabase(context:Context):Promisevoid{conststoreawaitrelationalStore.getRdbStore(context,{name:xiexin.db,securityLevel:relationalStore.SecurityLevel.S1});awaitstore.executeSql(CREATE_LETTERS_TABLE);}二、CRUD 操作classLetterRepository{privatestore:relationalStore.RdbStore;constructor(store:relationalStore.RdbStore){this.storestore;}asyncinsert(letter:Letter):Promisenumber{constrow{penPalId:letter.penPalId,penPalName:letter.penPalName,body:letter.body,isSender:letter.isSender?1:0,status:letter.status,wordCount:letter.wordCount,createdAt:Date.now()};returnawaitthis.store.insert(letters,row);}asyncqueryByPenPalId(penPalId:number):PromiseLetter[]{constpredicatesnewrelationalStore.RdbPredicates(letters);predicates.equalTo(penPalId,penPalId);predicates.orderByDesc(createdAt);constresultawaitthis.store.query(predicates);// 解析结果return[];}}三、事务管理asyncaddLetterWithTransaction(letter:Letter):Promisevoid{awaitthis.store.beginTransaction();try{awaitthis.insert(letter);awaitthis.store.commit();}catch(e){awaitthis.store.rollback();throwe;}}四、迁移对比维度AppStorageArkData RDB持久化否是查询能力数组遍历SQL 查询事务支持无有适用场景小型数据大量数据十一、深度实现分析11.1 核心原理本功能的核心原理基于 ArkUI 的响应式状态管理机制。当 State 或 Prop 装饰的变量发生变化时ArkUI 引擎会自动触发依赖该变量的 UI 部分重新渲染无需手动操作 DOM。11.2 数据流设计渲染错误:Mermaid 渲染失败: Parse error on line 2: ... LR A[用户交互] -- B[State 变量变化] B ----------------------^ Expecting AMP, COLON, PIPE, TESTSTR, DOWN, DEFAULT, NUM, COMMA, NODE_STRING, BRKT, MINUS, MULT, UNICODE_TEXT, got LINK_ID11.3 性能考虑避免不必要渲染使用 Watch 控制渲染时机减少嵌套深度保持组件树扁平化合理使用缓存计算结果可缓存避免重复计算十二、实际项目应用在 xiexin 项目中本功能被应用于以下场景笔友列表展示笔友通信状态信件卡片展示信件内容和状态标签统计页面展示写信趋势数据Componentexportstruct RealWorldExample{Statedata:string[][];build(){Column(){ForEach(this.data,(item:string){Text(item).fontSize(14)},(item:string)item)}}}十三、生产环境注意事项错误处理所有异步操作需要 try-catch 包围日志记录使用 hilog 记录关键操作性能监控使用 hiTraceMeter 埋点内存管理及时清理定时器和监听器try{awaitthis.loadData();hilog.info(0xFF00,TAG,Data loaded successfully);}catch(err){hilog.error(0xFF00,TAG,Failed to load: %{public}s,err.message);}十四、代码审查清单Prop 变量是否有默认值定时器是否在 aboutToDisappear 中清理列表渲染的 keyGenerator 是否唯一条件渲染是否使用 if/else 而非 Visibility复杂计算是否缓存结果事件监听是否在 aboutToDisappear 中取消资源引用是否使用 $r 语法颜色值是否使用 AppColors 设计令牌十五、综合示例EntryComponentstruct DemoPage{Stateitems:string[][示例1,示例2,示例3];Statecount:number0;build(){Column({space:16}){Text(综合示例).fontSize(24).fontWeight(FontWeight.Bold)Text(计数:${this.count}).fontSize(16)Row({space:8}){Button(增加).onClick((){this.count})Button(减少).onClick((){if(this.count0)this.count--})Button(重置).onClick((){this.count0})}List(){ForEach(this.items,(item:string){ListItem(){Text(item).fontSize(14).padding(12)}},(item:string)item)}.height(200)}.padding(16).width(100%)}}十六、相关 API 参考API说明版本要求State组件内部状态管理API 9Prop父子单向传递API 9Link父子双向同步API 9Watch状态变化监听API 9AppStorage全局状态存储API 9PersistentStorage持久化存储API 9十七、常见面试题Q1: State 和 Prop 的区别是什么A: State 是组件内部私有状态只能在当前组件内修改Prop 是父组件传递进来的数据在子组件中只能读取不能修改。Q2: ForEach 的 keyGenerator 为什么重要A: keyGenerator 决定了 ForEach 进行 Diff 算法的依据。如果键值不稳定或重复会导致列表项渲染异常。Q3: LazyForEach 和 ForEach 有什么区别A: ForEach 一次性渲染所有数据项LazyForEach 按需渲染可见项。数据量超过 100 项时建议使用 LazyForEach。十八、调试技巧使用 DevEco Profiler监控帧率和布局耗时使用 hilog打印关键日志使用 hiTraceMeter性能埋点分析使用 Watch监听状态变化使用 AppStorage全局状态调试StateWatch(onDebugChange)debugValue:string;onDebugChange():void{console.log(Value changed to:,this.debugValue);}十九、补充说明提示本文提供的代码示例基于 HarmonyOS API 12适用于 HarmonyOS 5.0 及以上版本。如果你使用的是较低版本部分 API 可能不兼容。本文所有代码均可在 xiexin 项目中找到实际应用建议结合 DevEco Studio 开发工具进行调试如有疑问欢迎在评论区留言讨论二十、深度进阶分析20.1 架构设计原则在 HarmonyOS 应用开发中遵循以下架构设计原则可以显著提升代码质量单一职责每个组件只负责一个功能开闭原则对扩展开放对修改关闭依赖倒置依赖抽象而非具体实现接口隔离使用小接口而非大接口20.2 设计模式应用// 工厂模式创建不同类型的组件classComponentFactory{staticcreateComponent(type:string):Component{switch(type){caseavatar:returnnewAvatarComponent();casecard:returnnewCardContainer();default:thrownewError(Unknown type);}}}20.3 性能优化策略使用 LazyForEach大数据量列表使用懒加载组件复用使用 Reusable 装饰器状态管理合理使用 State/Prop/Link动画优化使用 animateTo 替代 setInterval二十一、代码示例详解21.1 基础组件示例Componentexportstruct BasicComponent{Proptitle:string;PropisActive:booleanfalse;build(){Column({space:8}){Text(this.title).fontSize(16).fontWeight(FontWeight.Medium)if(this.isActive){Text(活跃).fontSize(12).fontColor(AppColors.SUCCESS)}}.padding(16).backgroundColor(AppColors.CARD_BG).borderRadius(12)}}21.2 列表渲染示例EntryComponentstruct ListExample{Stateitems:string[][A,B,C,D,E];build(){List(){ForEach(this.items,(item:string){ListItem(){Text(item).fontSize(16).padding(16)}},(item:string)item)}.width(100%).divider({strokeWidth:1,color:AppColors.DIVIDER})}}21.3 状态管理示例EntryComponentstruct StateExample{Statecount:number0;PropinitialValue:number0;build(){Column({space:16}){Text(计数:${this.count}).fontSize(20)Text(初始值:${this.initialValue}).fontSize(14).fontColor(AppColors.TEXT_SECONDARY)Row({space:8}){Button(1).onClick((){this.count})Button(-1).onClick((){if(this.count0)this.count--})Button(重置).onClick((){this.countthis.initialValue})}}.padding(16)}}二十二、常见错误与解决方案错误类型错误描述解决方案编译错误Prop 未赋默认值添加默认值运行时错误路由参数未定义添加空值检查性能问题列表渲染卡顿使用 LazyForEach内存泄漏定时器未清理在 aboutToDisappear 中清理状态丢失State 变量未初始化在声明时赋默认值渲染异常ForEach 键值重复使用唯一 ID二十三、扩展阅读与参考HarmonyOS 官方文档: 应用开发指南ArkUI 组件参考: 组件文档状态管理详解: 状态管理高性能编程: 高性能实践自定义组件: 组件开发二十四、总结与最佳实践24.1 核心要点状态管理合理选择 State/Prop/Link/StorageProp组件设计遵循单一职责原则性能优化大数据量使用 LazyForEach代码质量编写单元测试和文档24.2 推荐实践使用 AppColors 设计令牌统一管理颜色使用 Constants.ets 集中管理常量使用 DataStore 门面模式封装数据操作使用 Builder 提取复用 UI 片段使用 BuilderParam 实现组件插槽24.3 避免的反模式避免在 build 中执行耗时操作避免在 State 中存储大型对象避免过度使用 Link 增加耦合避免在 aboutToAppear 中执行异步操作避免使用全局变量替代 StorageProp提示以上最佳实践基于 xiexin 项目的实际开发经验建议在项目开发中遵守这些原则可以有效提升代码质量和开发效率。总结本文详细剖析了 xiexin 从 AppStorage 迁移到 ArkData 关系型存储的方案重点讲解了relationalStore.getRdbStore创建数据库、CREATE TABLE建表 SQL、bucket.insert()/query()CRUD 操作以及store.beginTransaction()事务管理。如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力HarmonyOS 应用开发指南https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/application-dev-guideHarmonyOS 状态管理概述https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-state-management-overviewHarmonyOS 高性能编程实践https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-high-performance-programmingHarmonyOS 自定义组件https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-custom-components相关资源开源鸿蒙跨平台社区https://openharmonycrossplatform.csdn.netHarmonyOS 关系型数据库https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/data-persistence-by-rdb-store
RELATED

相关推荐

大语言模型输出后处理技术与工程实践

大语言模型输出后处理技术与工程实践

1. 大模型输出处理的必要性在提示词工程实践中,我们常常发现大语言模型(LLM)的原始输出存在诸多需要优化的地方。比如输出格式不一致、包含冗余信息、需要特定结构化处理等问题。这些问题在实际业务场景中会严重影响下游系统的对接效率。我最…

📅 2026/10/24 15:34:29
深度学习批次大小:原理、优化与实践指南

深度学习批次大小:原理、优化与实践指南

1. 为什么批次大小是深度学习的核心超参数在训练神经网络时,批次大小(Batch Size)直接影响着模型收敛速度、内存占用和最终性能。我第一次调参时曾天真地认为"越大越好",结果在32GB显存的机器上直接OOM(内存…

📅 2026/10/25 14:52:43
【2027最新】基于SpringBoot+Vue的学生心理咨询评估系统管理系统源码+MyBatis+MySQL

【2027最新】基于SpringBoot+Vue的学生心理咨询评估系统管理系统源码+MyBatis+MySQL

💡实话实说: 有自己的项目库存,不需要找别人拿货再加价,所以能给到超低价格。 博主介绍: 在校期间积极参与实验室项目研发,现为CSDN特邀作者、掘金优质创作者。专注于Java开发、Spring Boot框架、前后端分离…

📅 2026/10/27 2:34:39
MORE NEWS

更多资讯

📰

青县哪里能考电工证 低学历也能拿电子证书的正确打开方式

青县哪里能考电工证 低学历也能拿电子证书的正确打开方式 学历不高怕报不上名?其实现在考电工证已经不再那么难了,特别是青县哪里能考电工证这个问题,越来越多人开始关注。随着国家对安全生产的重视,电工证作为从事电气作业的必备资质,已经不仅仅是“有…

📰

开封哪有代办电工证的怎么考 值不值得考一文说清

开封哪有代办电工证的怎么考 值不值得考一文说清 证书过期了不知道怎么复审延期,这种焦虑你肯定经历过。尤其是在电工这个岗位上,证书不仅是上岗的门槛,更是保障安全作业的“护身符”。如果你正在开封,想知道哪里可以代办电工证,又在纠结值不值得考,那…

📰

电工作业答案试画出官方回应全流程避坑指南

电工作业答案试画出官方回应全流程避坑指南 怕考不过白交培训费?这事儿官方回应来了,各地市安全生产教育培训中心明确表示, 电工作业答案试画出…

📰

清丰县办电工证值不值得考?工地太忙根本没时间复习考试

清丰县办电工证值不值得考?工地太忙根本没时间复习考试 工地太忙根本没时间复习考试,这几乎是每个电工从业者的真实写照。特别是清丰县的建筑工地,工期紧、任务重,电工证考试成了很多人想办却没时间准备的“心病”。清丰县办电工证值不值得考?答案其实很…

📰

佛山低压电工证在哪考?学历不高也能报,官方报名入口在这

佛山低压电工证在哪考?学历不高也能报,官方报名入口在这 你是不是也担心学历不高报不了名?其实,佛山低压电工证的报考门槛并不高,关键是要找对 官方报名入口…

📰

电工证培训怎么最快查询电子证书

电工证培训怎么最快查询电子证书 证书过期了不知道怎么复审延期,这事儿我真遇到过。去年冬天,我在新乡做建筑电工,忙得连轴转,结果到了年底才发现,我的电工证快到期了。那时候才知道,电子证书查询和复审不是一两天能搞定的事儿,特别是对像我这样常年在…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

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

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

📞 💬