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

效果如下:

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

相关推荐
大雷神2 小时前
HarmonyOS智慧农业管理应用开发教程--高高种地---第4篇:引导流程与用户画像
华为·harmonyos
AI_零食2 小时前
鸿蒙跨端框架 Flutter 学习 Day 6:Future 在 UI 渲染中的心跳逻辑
学习·flutter·ui·华为·harmonyos·鸿蒙
信创天地2 小时前
信创日志全流程管控:ELK国产化版本与华为日志服务实战应用
运维·安全·elk·华为·rabbitmq·dubbo
小码吃趴菜2 小时前
MySQL远程连接
数据库·mysql
被星1砸昏头2 小时前
高级爬虫技巧:处理JavaScript渲染(Selenium)
jvm·数据库·python
王文搏2 小时前
MySQL 常用函数用法速查(含解释与示例)
数据库·mysql·adb
信创天地2 小时前
国产关系型数据库部署与权限管理实战:人大金仓、达梦、南大通用、华为GaussDB
数据库·华为·gaussdb
夜雨声烦丿2 小时前
Flutter 框架跨平台鸿蒙开发 - 文字反转工具应用开发教程
flutter·华为·harmonyos
哈哈你是真的厉害2 小时前
基础入门 React Native 鸿蒙跨平台开发:实现一个简单的倒计时工具
react native·react.js·harmonyos