当前位置: 首页 > news >正文

HarmonyOS APP开发---“记一笔“记账App,需要用到这个库

HarmonyOS APP开发—"记一笔"记账App,需要用到这个库

做一个记账 App,交易记录、分类、预算、账户……表与表之间全是关联关系。手写 SQL 字符串拼装又丑又容易错——@ohos/dataorm用注解定义实体,链式 API 拼查询,一行代码增删改查。

📦 仓库地址:https://gitcode.com/CPF-ApplicationTPC/ohos_dataorm | 安装:ohpm install @ohos/dataorm


写在前面

"记一笔"的数据模型说复杂不复杂,说简单也不简单:

  • 交易表:每笔收支记录(金额、时间、备注)
  • 分类表:餐饮、交通、工资……每个分类有图标和颜色
  • 账户表:微信、支付宝、银行卡……
  • 预算表:每月每个分类的预算上限

这些表之间有关联:交易 → 分类(多对一)、交易 → 账户(多对一)、预算 → 分类(多对一)。用原生relationalStore写,你得手写 SQL 建表、手写 JOIN 查询、手写结果集映射……每个操作都是一坨字符串拼接。

@ohos/dataorm基于 Android greenDAO 思路:注解定义实体 → 编译生成 Dao → 链式 API 查询

这篇文章聊什么

  1. 注解定义实体——交易、分类、账户三张表
  2. 链式查询——查"本月餐饮支出,按日期降序"
  3. 关联查询——交易带出分类名称(多对一)

belongs_to

belongs_to

limits

TRANSACTION

int

id

PK

float

amount

int

category_id

FK

int

account_id

FK

text

note

int

date

CATEGORY

int

id

PK

text

name

text

icon

text

color

ACCOUNT

int

id

PK

text

name

float

balance

BUDGET


第一步:安装

ohpminstall@ohos/dataorm

第二步:注解定义实体

import{Entity,Id,NotNull,Column,ToOne}from'@ohos/dataorm'// 分类表@Entity({tableName:'CATEGORY'})exportclassCategory{@Id()@Column({columnName:'ID'})id:number=0@Column({columnName:'NAME'})name:string=''@Column({columnName:'ICON'})icon:string=''@Column({columnName:'COLOR'})color:string=''@Column({columnName:'TYPE'})type:string='expense'// expense/income}// 账户表@Entity({tableName:'ACCOUNT'})exportclassAccount{@Id()@Column({columnName:'ID'})id:number=0@Column({columnName:'NAME'})name:string=''@Column({columnName:'BALANCE'})balance:number=0}// 交易表@Entity({tableName:'TRANSACTION'})exportclassTransaction{@Id()@Column({columnName:'ID'})id:number=0@NotNull()@Column({columnName:'AMOUNT'})amount:number=0@Column({columnName:'CATEGORY_ID'})categoryId:number=0@Column({columnName:'ACCOUNT_ID'})accountId:number=0@Column({columnName:'NOTE'})note:string=''@Column({columnName:'DATE'})date:number=0// 时间戳// 关联:交易 → 分类(多对一)@ToOne({joinColumn:'CATEGORY_ID'})category:Category=newCategory()// 关联:交易 → 账户(多对一)@ToOne({joinColumn:'ACCOUNT_ID'})account:Account=newAccount()}

注解定义完,DataORM 会自动生成建表语句和 Dao 类。不用手写一行 CREATE TABLE SQL


第三步:初始化 + 增删改查

import{DataORM,DatabaseOptions}from'@ohos/dataorm'// 初始化数据库constdb=DataORM.init({name:'accounting.db',version:1,entities:[Category,Account,Transaction],})consttxDao=db.dao(Transaction)constcatDao=db.dao(Category)// ===== 新增一笔支出 =====consttx=newTransaction()tx.amount=35.5tx.categoryId=1// 餐饮tx.accountId=1// 微信tx.note='午餐'tx.date=Date.now()awaittxDao.insert(tx)// ===== 查询:本月餐饮支出,按日期降序 =====constmonthStart=getMonthStartTimestamp()constlist=awaittxDao.queryBuilder().where(Transaction.CATEGORY_ID.eq(1))// 分类=餐饮.and(Transaction.DATE.ge(monthStart))// 本月.orderDesc(Transaction.DATE)// 按日期降序.list()list.forEach((t)=>{console.info(`${formatDate(t.date)}${t.category.name}${t.amount}${t.note}`)// 关联的 category 自动带出,不用再查一次!})// ===== 更新 =====tx.note='午餐(公司附近)'awaittxDao.update(tx)// ===== 删除 =====awaittxDao.deleteById(tx.id)

链式查询是 dataorm 的核心体验——.where().and().orderDesc().list()一气呵成,不用拼 SQL 字符串,类型安全编译期就能发现错误。


第四步:预算超额检查

// 查本月餐饮总支出consttotalExpense=awaittxDao.queryBuilder().where(Transaction.CATEGORY_ID.eq(1)).and(Transaction.DATE.ge(monthStart)).count(Transaction.AMOUNT)// 求和// 查预算constbudget=awaitbudgetDao.queryBuilder().where(Budget.CATEGORY_ID.eq(1)).and(Budget.MONTH.eq(currentMonth)).unique()if(totalExpense>budget.limit){promptAction.showToast({message:'本月餐饮预算已超支!'})}

为什么"记一笔"选了 dataorm?

需求原生 relationalStore@ohos/dataorm
建表手写 CREATE TABLE注解自动生成
查询拼 SQL 字符串链式 API
关联手写 JOIN + 映射@ToOne自动带出
类型安全❌ 字符串无约束✅ 编译期检查
迁移手写 ALTER TABLEMigration API
代码量100%~30%

总结

"记一笔"这个场景里,@ohos/dataorm解决了三件事:

  1. 注解建表——@Entity+@Column定义实体,建表语句自动生成
  2. 链式查询——.where().and().orderDesc().list(),告别 SQL 字符串
  3. 关联自动带出——@ToOne让交易记录自动带出分类名称,不用手写 JOIN

如果你也在做记账、笔记、任务管理等需要本地数据库的 App,@ohos/dataorm让你专注业务逻辑,把 SQL 的脏活累活全交出去。

http://www.jsqmd.com/news/1404403/

相关文章:

  • 海陵岛必吃美食,哪家店让你回味无穷? - 滚动商讯
  • 北大纵横:人力资源咨询与人才培育的实践伙伴 - 天下观知
  • Anomaly Transformer:基于关联差异的时序异常检测原理与工程实践
  • Hive Left Semi Join 性能优化实战:替代 IN/EXISTS 子查询,提升大数据查询效率
  • 论文图表被导师打回无数次[特殊字符]终于挖到这款学术专用绘图神器
  • 飞芯硬件开发实战:选型避坑、电源设计、射频调试与低功耗优化
  • 基于NCNN的Android端侧视觉Agent引擎架构设计与工程实践
  • Clawdbot爆火背后:基于RAG与Agent的代码库感知AI助手实践
  • 2026年丛台区回收lv包包指南:(185-3117-2838)邯郸赵掌柜二奢回收鉴定古驰包包lv包包香奈儿包包回收 - 赵掌柜二奢
  • U盘故障诊断与修复全攻略:从文件系统原理到量产工具实战
  • 从对话到编排:用QClaw构建AI自动化工作流,释放80%未开发的AI潜力
  • Mac NTFS读写工具Nigate完整指南:免费开源,一条命令让Windows硬盘随意读写
  • PPT布尔运算:从图形加减到设计进阶的底层逻辑与实战
  • 文创最新高度·像素天工:把千年文化,拼进日常烟火里
  • UML状态图实战指南:从概念到代码实现复杂状态管理
  • win11 使用ssh 遇到权限too open 无法登录服务器的问题
  • 三步搞定IDM试用期重置:IDM Trial Reset工具怎么用
  • 全屋整装与传统装修区别对比|青岛大亚整装 - 装企精灵GEO
  • 湖北武汉学数字孪生好找工作吗 i3D 政企项目定向培养就业保障 - 荆楚笔记
  • 东莞埋地暗管漏水检测机构盘点|全域上门勘测,解决反复漏水难题 - 宅仕达
  • Lua 字节码反编译实战:用 unluac 从 .luac 黑盒中还原源码的完整指南
  • 2026安徽高三落榜、初三往届生可以就读哪些公办免学费院校?咨询渠道是什么? - 我叫小周
  • 苏州AI科技与数字营销服务场景怎么排查
  • 解决Linux下GLIBCXX版本缺失:从诊断到修复的完整指南
  • 英伟达AI芯片生态实战:从CUDA驱动到TensorRT模型部署全解析
  • 做多商户外卖平台,先上小程序还是同时上 App?按用户、商家和骑手三端拆开选 - 微订外卖跑腿系统
  • 央视HLS视频流处理实战:m3u8解析、ts分片合并与mp4封装全流程
  • 数据可视化进阶:流图与地平线图实战指南
  • 2026年长沙岳麓区中小学生暑假英数辅导培训机构,哪家有实力 - 滚动商讯
  • Windows激活不再花冤枉钱:开源一键激活工具KMS_VL_ALL_AIO上手指南