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 查询。这篇文章聊什么注解定义实体——交易、分类、账户三张表链式查询——查本月餐饮支出按日期降序关联查询——交易带出分类名称多对一belongs_tobelongs_tolimitsTRANSACTIONintidPKfloatamountintcategory_idFKintaccount_idFKtextnoteintdateCATEGORYintidPKtextnametexticontextcolorACCOUNTintidPKtextnamefloatbalanceBUDGET第一步安装ohpminstallohos/dataorm第二步注解定义实体import{Entity,Id,NotNull,Column,ToOne}fromohos/dataorm// 分类表Entity({tableName:CATEGORY})exportclassCategory{Id()Column({columnName:ID})id:number0Column({columnName:NAME})name:stringColumn({columnName:ICON})icon:stringColumn({columnName:COLOR})color:stringColumn({columnName:TYPE})type:stringexpense// expense/income}// 账户表Entity({tableName:ACCOUNT})exportclassAccount{Id()Column({columnName:ID})id:number0Column({columnName:NAME})name:stringColumn({columnName:BALANCE})balance:number0}// 交易表Entity({tableName:TRANSACTION})exportclassTransaction{Id()Column({columnName:ID})id:number0NotNull()Column({columnName:AMOUNT})amount:number0Column({columnName:CATEGORY_ID})categoryId:number0Column({columnName:ACCOUNT_ID})accountId:number0Column({columnName:NOTE})note:stringColumn({columnName:DATE})date:number0// 时间戳// 关联交易 → 分类多对一ToOne({joinColumn:CATEGORY_ID})category:CategorynewCategory()// 关联交易 → 账户多对一ToOne({joinColumn:ACCOUNT_ID})account:AccountnewAccount()}注解定义完DataORM 会自动生成建表语句和 Dao 类。不用手写一行 CREATE TABLE SQL。第三步初始化 增删改查import{DataORM,DatabaseOptions}fromohos/dataorm// 初始化数据库constdbDataORM.init({name:accounting.db,version:1,entities:[Category,Account,Transaction],})consttxDaodb.dao(Transaction)constcatDaodb.dao(Category)// 新增一笔支出 consttxnewTransaction()tx.amount35.5tx.categoryId1// 餐饮tx.accountId1// 微信tx.note午餐tx.dateDate.now()awaittxDao.insert(tx)// 查询本月餐饮支出按日期降序 constmonthStartgetMonthStartTimestamp()constlistawaittxDao.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 字符串类型安全编译期就能发现错误。第四步预算超额检查// 查本月餐饮总支出consttotalExpenseawaittxDao.queryBuilder().where(Transaction.CATEGORY_ID.eq(1)).and(Transaction.DATE.ge(monthStart)).count(Transaction.AMOUNT)// 求和// 查预算constbudgetawaitbudgetDao.queryBuilder().where(Budget.CATEGORY_ID.eq(1)).and(Budget.MONTH.eq(currentMonth)).unique()if(totalExpensebudget.limit){promptAction.showToast({message:本月餐饮预算已超支})}为什么记一笔选了 dataorm需求原生 relationalStoreohos/dataorm建表手写 CREATE TABLE注解自动生成查询拼 SQL 字符串链式 API关联手写 JOIN 映射ToOne自动带出类型安全❌ 字符串无约束✅ 编译期检查迁移手写 ALTER TABLEMigration API代码量100%~30%总结记一笔这个场景里ohos/dataorm解决了三件事注解建表——EntityColumn定义实体建表语句自动生成链式查询——.where().and().orderDesc().list()告别 SQL 字符串关联自动带出——ToOne让交易记录自动带出分类名称不用手写 JOIN如果你也在做记账、笔记、任务管理等需要本地数据库的 Appohos/dataorm让你专注业务逻辑把 SQL 的脏活累活全交出去。