二十八、【鸿蒙 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%')
  }
}

效果如下:

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

相关推荐
李广坤17 小时前
MySQL 大表字段变更实践(改名 + 改类型 + 改长度)
数据库
SummerKaze21 小时前
为鸿蒙开发者写一个 nvm:hmvm 的设计与实现
harmonyos
爱可生开源社区2 天前
2026 年,优秀的 DBA 需要具备哪些素质?
数据库·人工智能·dba
随逸1772 天前
《从零搭建NestJS项目》
数据库·typescript
在人间耕耘3 天前
HarmonyOS Vision Kit 视觉AI实战:把官方 Demo 改造成一套能长期复用的组件库
人工智能·深度学习·harmonyos
加号33 天前
windows系统下mysql多源数据库同步部署
数据库·windows·mysql
シ風箏3 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
李慕婉学姐3 天前
Springboot智慧社区系统设计与开发6n99s526(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
百锦再3 天前
Django实现接口token检测的实现方案
数据库·python·django·sqlite·flask·fastapi·pip
王码码20353 天前
Flutter for OpenHarmony:socket_io_client 实时通信的事实标准(Node.js 后端的最佳拍档) 深度解析与鸿蒙适配指南
android·flutter·ui·华为·node.js·harmonyos