二十八、【鸿蒙 NEXT】orm框架

【前言】

在开发sqlite数据库时,如果使用原生的创建表,增删改查数据时还需要自己封装等等,比较麻烦,这里介绍一个orm框架@ohos/dataorm,可以方便的创建,升级,查询数据等的操作

1、继承框架的抽象类OpenHelper

该类主要是来创建、升级数据库的,如果没有特殊操作,可以不用实现该类的方法

javascript 复制代码
import { OpenHelper } from "@ohos/dataorm";

export class DbHelper extends OpenHelper {

}

2、创建数据库表的类

javascript 复制代码
import { Columns, ColumnType, Entity, Id } from "@ohos/dataorm";

@Entity('msg_t')
export class MsgTable {
  @Id({isPrimaryKey:true})
  @Columns({columnName:'id',types:ColumnType.str})
  id?:string
  @Columns({columnName:'name',types:ColumnType.str})
  name?:string
  @Columns({columnName:'create_time',types:ColumnType.num})
  createTime?:number = 0

  constructor(id: string, name: string, createTime: number) {
    this.id = id;
    this.name = name;
    this.createTime = createTime;
  }

}

3、初始化数据库,并创建表

javascript 复制代码
import { DaoMaster, GlobalContext, OpenHelper } from "@ohos/dataorm"
import { DbHelper } from "./DbHelper"
import { relationalStore } from "@kit.ArkData"
import { MsgTable } from "./MsgTable"

export class SqlMgr {
  private static instance:SqlMgr
  private static  default_db_name = 'test.db'
  public static  default_db_session = 'test_session'
  private static target_version = 1
  private constructor() {
  }
  public static getInstance():SqlMgr {
    return SqlMgr.instance || (SqlMgr.instance = new SqlMgr())
  }
  public async initDefault(context:Context) {
    try {
      let helper:DbHelper = new DbHelper(context, SqlMgr.default_db_name)
      // 设置数据库是否加密
      helper.setEncrypt(false)
      helper.setSecurityLevel(relationalStore.SecurityLevel.S4)
      // 是否打印日志
      helper.setLogger(true)
      // 设置数据库版本
      helper.setVersion(SqlMgr.target_version)
      await helper.setAutoMigrate(false)
      // 设置创建的表
      helper.setEntities(MsgTable)
      // 创建数据库
      let db = await helper.getWritableDb()
      db.name = SqlMgr.default_db_name
      GlobalContext.getContext().setValue(SqlMgr.default_db_session, new DaoMaster(db).newSession())
    } catch (e) {
      console.log(`===== ${JSON.stringify(e)}`)
    }
  }
}

4、在entryablity中调用3中的初始化方法

5、创建dao操作类

javascript 复制代码
import { DaoSession, GlobalContext, Property } from "@ohos/dataorm"
import { MsgTable } from "./MsgTable"
import { SqlMgr } from "./SqlMgr"

export class MsgDao {
  private static instance:MsgDao
  private entityClass = GlobalContext.getContext().getValue(GlobalContext.KEY_CLS) as Record<string,Object>
  // 获取MsgTable表的所有属性
  private properties = this.entityClass.MsgTable as Record<string, Property>
  private daoSession = GlobalContext.getContext().getValue(SqlMgr.default_db_session) as DaoSession
  // 操作数据库表的dao
  private dao = this.daoSession.getBaseDao<MsgTable,number>(MsgTable)
  private constructor() {
  }
  public static getInstance():MsgDao {
    return MsgDao.instance || (MsgDao.instance = new MsgDao())
  }

  /**
   * 插入或者替换数据
   * @param msgs
   * @returns 
   */
  public insertOrReplace(msgs:MsgTable[]):Promise<void> {
    return this.dao.insertOrReplaceInTxIterableAsync(msgs, true)
  }
  /**
   * 根据id更新数据
   * @param msgs
   * @returns
   */
  public updateById(id:string, name:string) {
    this.dao.updateSync(new MsgTable(id,name,new Date().getTime()))
  }
  /**
   * 分页查询数据
   * @param id
   * @param lastTime
   * @param pageSize
   * @returns 
   */
  public queryByMsgs(id:string, lastTime:number, pageSize:number = 20):MsgTable[] {
    return this.dao.queryBuilder()
      .where(this.properties['id'].gt(id))
      .where(this.properties['createTime'].lt(lastTime))
      .orderDesc(this.properties['createTime'])
      .limit(pageSize)
      .build()
      .listSync()
  }
}

6、创建page页面,调用dao方法

javascript 复制代码
import { MsgDao } from './MsgDao';
import { MsgTable } from './MsgTable';

@Entry
@Component
struct DBPage {
  @State msgs:MsgTable[] = []

  build() {
    Column() {
      Button('add').onClick(() => {
        let d1 = new MsgTable('1','张1', new Date().getTime())
        let d2 = new MsgTable('2','张2', new Date().getTime())
        let d3 = new MsgTable('3','张3', new Date().getTime())
        MsgDao.getInstance().insertOrReplace([d1,d2,d3])
      })
      Button('query').onClick(() => {
        this.msgs = MsgDao.getInstance().queryByMsgs('1',new Date().getTime())
      })
      List(){
        ForEach(this.msgs, (item:MsgTable) => {
          ListItem(){
            Row({space:8}){
              Text(item.id)
              Text(item.name)
            }
          }
        })
      }
    }
    .height('100%')
    .width('100%')
  }
}

效果如下:

用上一章的数据库工具查看数据:

相关推荐
乌暮33 分钟前
Spring AOP 与 Spring 事务:用大白话彻底理解原理与实践
java·数据库·spring boot·后端·sql·学习·spring
小此方1 小时前
Re:Mysql数据库基础篇(十二):什么是事务、事务解决了什么问题、事务的四大属性、事务的操作方式
数据库·mysql
flash俊杰2 小时前
v0.5-01 让桌面 AI 助手记得住:预算组装、递归摘要、长期记忆与评估基线
数据库·安全·架构
江华森3 小时前
把鸿蒙云手机调试的 5 个坑写成 Skill:12 项检查清单与报错决策树
harmonyos
2501_933923253 小时前
redis:string类型常见命令
数据库·redis·缓存
木木子224 小时前
用华为云码道构建校园导航应用「新生通」:从需求分析到工程落地
华为·华为云·harmonyos
byte轻骑兵4 小时前
时序数据库选型指南:Apache IoTDB 社区版实践与踩坑
数据库·人工智能·apache·时序数据库·iotdb
黄连木笛5 小时前
Redis Insight 汉化教程:Windows / macOS / Linux 设置中文界面(附繁體、教程汉化、关闭自动更新)
数据库·redis·缓存
nice_lcj5205 小时前
MySQL 存储引擎入门:InnoDB 和 MyISAM 到底怎么选
java·数据库·mysql·面试·innodb·存储引擎·myisam
贾伟康5 小时前
HarmonyOS API 26 Navigation 自适应模式:mode、分栏切换与窗口断点治理
harmonyos·arkts·arkui·navigation·自适应布局