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

效果如下:

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

相关推荐
ggabb3 小时前
中文的精确与意境,从来都不是英文能比肩的
sqlite
果粒蹬i3 小时前
【HarmonyOS】DAY7:鸿蒙跨平台 Tab 开发问题与列表操作难点深度复盘
华为·harmonyos
万岳科技系统开发3 小时前
食堂采购系统源码库存扣减算法与并发控制实现详解
java·前端·数据库·算法
王码码20353 小时前
Flutter for OpenHarmony 实战之基础组件:第二十七篇 BottomSheet — 动态底部弹窗与底部栏菜单
android·flutter·harmonyos
小镇敲码人3 小时前
探索CANN框架中TBE仓库:张量加速引擎的优化之道
c++·华为·acl·cann·ops-nn
冉冰学姐4 小时前
SSM智慧社区管理系统jby69(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·管理系统·智慧社区·ssm 框架
杨超越luckly4 小时前
HTML应用指南:利用GET请求获取中国500强企业名单,揭秘企业增长、分化与转型的新常态
前端·数据库·html·可视化·中国500强
Elastic 中国社区官方博客4 小时前
Elasticsearch:Workflows 介绍 - 9.3
大数据·数据库·人工智能·elasticsearch·ai·全文检索
仍然.4 小时前
MYSQL--- 聚合查询,分组查询和联合查询
数据库
ITUnicorn4 小时前
【HarmonyOS6】ArkTS 自定义组件封装实战:动画水杯组件
华为·harmonyos·arkts·鸿蒙·harmonyos6