【前言】
在开发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%')
}
}
效果如下:

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