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

效果如下:

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

相关推荐
提子拌饭13340 分钟前
风息时钟:鸿蒙Flutter 实现的自然风格时钟应用
flutter·华为·架构·开源·harmonyos
浮芷.4 小时前
Flutter 框架跨平台鸿蒙开发 - AR动物互动应用
flutter·ar·harmonyos
科技小花4 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸4 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain4 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希5 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神5 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员5 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java5 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿5 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb