【鸿蒙优选三方库】@ohos/dataorm:让 HarmonyOS 的数据库操作告别手写 SQL

【鸿蒙优选三方库】@ohos/dataorm:让 HarmonyOS 的数据库操作告别手写 SQL

在鸿蒙应用里做数据持久化,还在为关系型数据库的 SQL 语句头疼?@ohos/dataorm 基于 Android 圈经典 greenDAO 思路打造,用注解定义实体一行代码操作数据库链式调用拼装查询------让你专注业务,告别样板 SQL。

  • 包名@ohos/dataorm
  • 当前版本:v2.3.10-rc.1
  • 协议:Apache License 2.0
  • 安装ohpm install @ohos/dataorm
  • 仓库gitcode.com/CPF-Applica...

一、它解决了什么问题?

HarmonyOS 应用做本地持久化,常见选择是关系型数据库(RDB)。但直接用原生 RDB Store,会遇到这些痛点:

  • 写 SQL 字符串拼装,易出错且难维护;
  • 表结构变更需要手动处理迁移;
  • 实体 ↔ 数据库映射全部手写;
  • 关联查询(一对多、多对一)写起来痛苦;
  • 批量操作缺乏统一封装;
  • 异步/同步命名混乱。

@ohos/dataorm 把 Java/Kotlin 圈最成熟的 greenDAO 思路搬进 HarmonyOS ArkTS:

  • @Entity@Id@Column@ToMany 等注解声明模型;
  • 编译期生成 Dao 类;
  • 链式 API 拼装查询;
  • 内置迁移、监听、缓存、批量操作工具。

二、核心特点

特性 说明
注解式实体定义 @Entity@Id@NotNull@Unique@Index
完整关联关系 @ToMany@ToOne@JoinEntity@OrderBy
类型转换 @Convert 自定义类型 ↔ 数据库值转换
嵌套对象 @Embedded@Transient@Union
链式查询 inquiry().where().eq().and().like().list()
QueryBuilder 高级 去重、JOIN、分页、计数、排序
数据库迁移 Migration API,平滑升级表结构
监听器 表/库级别数据变更监听
多数据库 单应用支持多个数据库并存
异步/同步 统一 Async/Sync 命名后缀
DbUtils 工具 读取 rawfile 等常用工具方法

三、适用场景

  • 本地数据存储:用户信息、设置、配置、缓存。
  • 业务实体持久化:订单、商品、文章、聊天记录。
  • 复杂关联模型:一对多(用户-订单)、多对一(订单-商品)、多对多(标签-文章)。
  • 数据迁移需求:版本迭代时表结构平滑升级。
  • 需要监听变化:跨页面/跨组件响应数据变更。
  • 替代手写 SQL:减少样板代码与 SQL 注入风险。
  • 教学/参考:学习鸿蒙 ORM 的完整工程范式。

四、快速上手

1. 安装

bash 复制代码
ohpm install @ohos/dataorm

2. 定义实体(注解)

typescript 复制代码
import { Entity, Id, NotNull, Column, Index } from '@ohos/dataorm'

@Entity({ tableName: 'NOTE' })
export class Note {
  @Id()
  @Column({ columnName: 'ID' })
  id: number = 0

  @NotNull()
  @Column({ columnName: 'TEXT' })
  text: string = ''

  @Column({ columnName: 'COMMENT' })
  comment: string = ''

  @Column({ columnName: 'DATE' })
  date: number = 0
}

3. 初始化数据库

typescript 复制代码
import { DataORM, DatabaseOptions } from '@ohos/dataorm'

const options: DatabaseOptions = {
  name: 'notes.db',
  version: 1,
  entities: [Note]
}

const db = DataORM.init(options)

4. 获取 Dao 与基本 CRUD

typescript 复制代码
const noteDao = db.dao(Note)

// 新增
const note = new Note()
note.text = 'Hello HarmonyOS'
note.date = Date.now()
const id = await noteDao.insert(note)

// 查询
const list = await noteDao.queryBuilder()
  .where(Note.TEXT.like('%Hello%'))
  .orderDesc(Note.DATE)
  .list()

// 更新
note.text = 'Updated'
await noteDao.update(note)

// 删除
await noteDao.deleteById(id)

5. 关联查询(一对多)

typescript 复制代码
@Entity({ tableName: 'USER' })
class User {
  @Id() @Column({ columnName: 'ID' }) id: number = 0
  @Column({ columnName: 'NAME' }) name: string = ''
  @ToMany({ joinEntity: Order.class })
  orders: List<Order> = new List()
}

@Entity({ tableName: 'ORDER' })
class Order {
  @Id() @Column({ columnName: 'ID' }) id: number = 0
  @Column({ columnName: 'USER_ID' }) userId: number = 0
  @ToOne({ joinColumn: 'USER_ID' })
  user: User = new User()
}

五、亮点能力速览

  • 注解声明一切:实体、字段、主键、唯一、索引、关联,全部用装饰器表达。
  • 链式查询 :类 jOOQ 风格的 inquiry() 链,复杂条件也能优雅拼装。
  • JOIN 支持:QueryBuilder 原生支持多表连接查询。
  • 数据库迁移 :版本升级时声明 Migration,工具帮你做表结构变更。
  • 数据监听:表级 / 库级监听器,跨组件响应数据变化。
  • 多数据库并存:单应用可同时维护多个独立数据库。
  • Async/Sync 命名规范:异步同步接口统一后缀,约定清晰。

六、为什么值得选它?

  1. 节省样板代码:注解 + 编译期生成 Dao,让代码量下降一个数量级。
  2. 类型安全:ArkTS 强类型贯穿定义、操作、查询全链路。
  3. 迁移无忧:版本迭代最怕的"老用户数据库炸了",Migration API 帮你兜底。
  4. 关联模型原生:一对一、一对多、多对多都能优雅表达。
  5. 可观测可监听:数据变更触发回调,UI 联动不愁。

如果你的鸿蒙应用需要本地关系型存储,又不想与 SQL 字符串死磕到底------@ohos/dataorm 把 greenDAO 十多年沉淀的 ORM 思想搬到了 HarmonyOS,放心用。

相关推荐
北墨NoLimit1 小时前
别再到处 try-catch 了:一个生产级鸿蒙 HTTP 客户端的封装实录
harmonyos
小雨青年3 小时前
【HarmonyOS 7 沉浸光感深度实战】 01 ArkUI 与 HDS 两套接口如何选择
华为·harmonyos
云端漫步19874 小时前
HarmonyOS NEXT AI 智能生活助手:AI 代码解释
人工智能·华为·生活·harmonyos
nullregedit4 小时前
HarmonyOS 弦乐调音器开发实战 03:参考音、调音历史与 AppStorage 如何形成闭环
harmonyos·arkts·appstorage·preferences·audiorenderer
木合塔尔 麦麦提4 小时前
鸿蒙关系数据库代码案例
华为·harmonyos
云_杰4 小时前
鸿蒙截图工具开发实战 02:截屏权限 CUSTOM\_SCREEN\_CAPTURE——"检查"和"申请"为什么必须是两个函数
华为·harmonyos
nullregedit4 小时前
HarmonyOS 弦乐调音器开发实战 02:AudioCapturer 与 NSDF 怎样完成实时音高检测
harmonyos·arkts·数字信号处理·audiocapturer·乐器调音
如此风景5 小时前
HarmonyOS应用开发-Navigation 路由表详解
harmonyos
云端漫步19875 小时前
HarmonyOS NEXT AI 智能生活助手:AI 待办事项生成
人工智能·华为·生活·harmonyos