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

鸿蒙应用开发—ZDbUtil高效使用数据库

文章目录

    • 介绍
    • 下载安装
    • 基本使用
      • 注解
        • Table
        • Id
        • Column
        • OneToOne
      • 使用方法
        • 定义实体类
        • 初始化数据库并根据被@Table注解的类创建表
        • 创建表
        • 查数据
        • 插入数据
        • 删除数据
        • 清空数据
    • 参考

介绍

ZDbUtil是一款基于SQLite的鸿蒙数据库框架,通过注解标注实体类与属性,让数据更能抽象化简化原生RdbStore的使用。同时支持V1和V2状态管理管理。

SQLite在鸿蒙上的基本使用可以参考:鸿蒙应用开发—数据持久化之SQLite

下载安装

在每个har/hsp模块中,通过ohpm工具下载安装库:

ohpm install @hzw/zdb

基本使用

注解

Table

表名为类名。

Id
  • 参数
    • primaryKey: 是否主键
    • autoIncrement: 是否自增
Column
  • 参数:
    • type: 列类型,查看ColumnType
    • notNull: 是否为空
    • unique: 是否唯一
OneToOne
  • 参数:
    • joinTable: 关联表的类
    • relatedIdProperty: 关联id属性名

使用方法

定义实体类

只要添加了@Table注解,@Id注解,@Column注解
在初始化数据库时,会自动创建表,并添加列。

import { Column, ColumnType, Id, OneToOne, Table } from '@hzw/zdb';

// 分类
@Table()
export class StudentClassify {
  // id
  @Id({ primaryKey: true, autoIncrement: true })
  @Column({ type: ColumnType.Integer })
  id?: number
  // 名称
  @Column({ type: ColumnType.Text })
  name?: string
  // 创建时间
  @Column({ type: ColumnType.Integer })
  createTime?: number
  // 更新时间
  @Column({ type: ColumnType.Integer })
  editTime?: number | undefined
}

// 学生
@Table()
export class StudentInfo {
  // id
  @Id({ primaryKey: true, autoIncrement: true })
  @Column({ type: ColumnType.Integer })
  id?: number | undefined
  // 标题
  @Column({ type: ColumnType.Text })
  title?: string | undefined
  // 创建时间
  @Column({ type: ColumnType.Integer })
  createTime?: number | undefined
  // 是否管理员
  @Column({ type: ColumnType.Boolean })
  isManager?: boolean | undefined
  // 分类id
  @Column({ type: ColumnType.Integer })
  classifyId?: number | undefined
  // 分类
  @OneToOne({ joinTable: StudentClassify, relatedIdProperty: "classifyId" })
  classify?: StudentClassify | undefined
}
初始化数据库并根据被@Table注解的类创建表
ZDbUtil.initDatabase({
  context: this.context
})
创建表

如果类不被@Table注解,则需要手动

// 定义表的数据结构
const student: StudentInfo2 = {
  "id": 0,
  "title": "",
  "createTime": 0,
  "isManager": false,
  "classifyId": 0,
}
// 创建表
// 第一个参数是表的数据结构
// 第二个参数是表名
// 第三个参数是id名
ZDbUtil.initTableByName(student, "Student", "id").then(() => {
  promptAction.showToast({ message: "创建成功" });
})
查数据

如果查询的数据类型有被@Table注解,则通过这种方式查询数据

ZDbUtil.querySqlBuilder<StudentClassify>(StudentClassify)
  .limitAs(this.pageSize)
  .offsetAs(this.page * this.pageSize)
    // ...
  .query()
  .then((data) => {
  })

否则通过这种方式查询数据

// 定义表的数据结构
const student: StudentInfo2 = {
  "id": 0,
  "title": "",
  "createTime": 0,
  "isManager": false,
  "classifyId": 0,
}
// 定义关联表的数据结构
const classify: StudentClassify2 = {
  "id": 0,
  "name": "",
  "createTime": 0,
  "editTime": 0,
}
// 查询表
// 第一个参数是表的数据结构
// 第二个参数是表名
// 第三个参数是id名
ZDbUtil.querySqlObjBuilder(student, "Student", "id")
  // 关联表
  // 第一个参数是关联表的数据结构
  // 第二个参数是关联表的表名
  // 第三个参数是关联表的id名
  // 第四个参数是与关联表关联的id字段名
  // 第五个参数是存放关联表数据的字段名
  .initJoinTableInfo(classify, "Classify", "id", "classifyId", "classify")
  .limitAs(this.pageSize)
  .offsetAs(this.page * this.pageSize)
  .query()
  .then((data) => {
    this.list = data;
  })
插入数据

data类型确定,且被@Table注解,直接插入数据

ZDbUtil.insertOrReplace(data).then(() => {
  promptAction.showToast({ message: "添加成功" });
})

data类型是Object,通过传入被@Table注解的类,插入数据

// 插入数据
// 第一个参数为插入的数据
// 第二个参数为被@Table注解的类,数据将会被插入到与注解类关联的表中
ZDbUtil.insertOrReplaceByCls(data, StudentClassify).then(() => {
  promptAction.showToast({ message: "添加成功" });
})

data类型是Object,通过传入表名插入数据

// 插入数据到数据库
// 第一个参数是插入的数据
// 第二个参数是表名
ZDbUtil.insertOrReplaceByName(data, "Student").then(() => {
  promptAction.showToast({ message: "添加成功" });
  this.loadData()
})
删除数据

data类型确定,且被@Table注解,直接删除数据

ZDbUtil.delete(item).then(() => {
  promptAction.showToast({ message: "删除成功" });
})

data类型是Object,通过传入被@Table注解的类,删除数据

ZDbUtil.deleteByCls(data, StudentInfo).then(() => {
  promptAction.showToast({ message: "删除成功" });
})

直接通过传入表名,id名,id的值删除数据

// 第一个参数是表名
// 第二个参数是id名
// 第三个参数是id的值
ZDbUtil.deleteByName("Student", "id", item.id).then(() => {
  promptAction.showToast({ message: "删除成功" });
  this.loadData()
})
清空数据

根据被@Table注解的类,清空与之关联的表的所有数据

ZDbUtil.clear(StudentInfo).then(() => {
  promptAction.showToast({ message: "清空成功" });
})

根据表名,清空该表的所有数据

ZDbUtil.clearByName("Classify").then(() => {
  promptAction.showToast({ message: "清空成功" });
  this.selectClassify = undefined
  this.loadClassify()
  this.loadData()
})

参考

  • https://blog.csdn.net/xiaolang555w_w/article/details/145677007
  • 源码:https://gitee.com/HW-Commons/ZDbUtil
  • OH仓库:https://ohpm.openharmony.cn/#/cn/detail/@hzw%2Fzdb

相关文章:

  • 线性回归中的最小二乘法:直接法与梯度下降的比较
  • Qt不同窗口类的控件信号和槽绑定
  • 数字化工厂人员定位系统方案之高危场景人员聚集预警系统架构设计(二)
  • Redis大Key问题全解析:从原理到实战的深度解决方案
  • MyBatis一对多查询方式
  • 什么是AI?AI能对我们生活产生哪些影响?
  • 基于Python的端口扫描器和目录扫描工具实现方案,结合机器学习进行指纹识别
  • Kubernetes学习笔记-IDEA开发工具本地调试
  • 离线服务器ollama新增qwen2:0.5b模型
  • 从零手工撸写个人工神经元网络(解决异或问题)Python+c++结构化
  • 江科大51单片机笔记【14】LCD1602(上)
  • 操作系统知识点27
  • 双 Token 无感刷新机制在前后端分离架构中实现
  • 【计量地理学】实验三 地理数据的基本统计分析
  • Unity使用自定义类的List在Inspector面板上显示异常(2021.3.4)
  • Appium等待机制--强制等待、隐式等待、显式等待
  • 工具(十二):Java导出MySQL数据库表结构信息到excel
  • 使用DeepSeek完成一个简单嵌入式开发
  • Apache Tomcat漏洞,对其进行升级
  • 前端及后端实现csv文件下载功能
  • 济南哪家公司做网站/百度快速优化推广
  • 毕业设计做网站想法/东莞网站推广技巧
  • 网站建设需求文案案例/网络营销成功的品牌
  • 静态手机网站/北京seo推广系统
  • 广东人才网官方网站招聘信息/可以免费打开网站的软件
  • 厦门外贸商城网站建设/seo快速排名网站优化