HarmonyOS Next 入门实战 - 关系型数据库、smartdb

SQLite数据库

HarmonyOS的关系型数据库基于SQLite
导入模块

import { relationalStore } from '@kit.ArkData';

实现步骤:

  1. 获取RdbStore对象,用于创建数据库,数据表,以及数据库升级等操作
let storeConfig = {name: 'Poetry.db',  //数据库文件名securityLevel: relationalStore.SecurityLevel.S1,  //安全级别encrypt: false, //是否加密,可选,默认不加密customDir: '', 	//自定义路径,可选,目录:context.databaseDir + '/rdb/' + customDirisReadOnly: false, //是否已只读方式打开,可选,默认false
}relationalStore.getRdbStore(this.context, this.storeConfig).then(store => {//创建表store.executeSql('sql')//判断版本store.version}).catch((err: Error) => {})
  1. 插入数据
let data :ValuesBucket={name:"zhangsan",age: 23,
}
store.insert("tableName",data).then((rowId)=>{//操作成功返回rowId,否则返回-1
})store.batchInsert() //用于插入批量数据
  1. 修改,删除数据:通过组件提供的谓词(Predicates)修改或删除组件
let data :ValuesBucket={name:"zhangsan",age: 26,
}
let predicates = new relationalStore.RdbPredicates("tableName")
predicates.equalTo("name","zhangsan")
//更新数据
store.update(data,predicates).then((value)=>{})//删除数据
store.delete(predicates).then((value)=>{})
  1. 查询数据
let predicates = new relationalStore.RdbPredicates("tableName")
predicates.equalTo("name","zhangsan")
store.query(predicates).then((resultSet)=>{while (resultSet.goToNextRow()){const name = resultSet.getString(resultSet.getColumnIndex("name"))const age = resultSet.getLong(resultSet.getColumnIndex("age"))}resultSet.close()
})
//也可以通过下面接口使用sql查询
store.querySql(sql: string, bindArgs?: Array<ValueType>): Promise<ResultSet>;
  1. 备份数据和恢复数据
//备份数据
store.backup("backup.db")
//恢复数据
store.restore("backup.db")

SmartDB

SmartDB与Android中的room组件类似,可以简化我们数据库操作的步骤,使代码更易维护。
安装和导入模块

//安装模块
ohpm install @liushengyi/smartdb
//导入模块
import sql from "@liushengyi/smartdb"

定义数据结构:

export class Poetry {@sql.SqlColumn(sql.ColumnType.TEXT)uuid?: string@sql.SqlColumn(sql.ColumnType.TEXT)title?: string@sql.SqlColumn(sql.ColumnType.TEXT)dynasty?: string@sql.SqlColumn(sql.ColumnType.TEXT)author?: string@sql.SqlColumn(sql.ColumnType.TEXT)introduction?: string@sql.SqlColumn(sql.ColumnType.TEXT)text?: string@sql.SqlColumn(sql.ColumnType.TEXT)textAlign?: string@sql.SqlColumn(sql.ColumnType.TEXT)translation?: string@sql.SqlColumn(sql.ColumnType.TEXT)rectify?: string@sql.SqlColumn(sql.ColumnType.TEXT)searchKey?: string
}

执行数据库操作:进行增删改查、事务操作

export class PoetryDao {public static TABLE_NAME = "Poetry"public static SQL_CREATE_TABLE ="CREATE TABLE IF NOT EXISTS `Poetry` (`uuid` TEXT NOT NULL, `title` TEXT, `dynasty` TEXT, `author` TEXT, `introduction` TEXT, `text` TEXT, `textAlign` TEXT, `translation` TEXT, `rectify` TEXT, `searchKey` TEXT, PRIMARY KEY(`uuid`))"@sql.SqlQuery(`select * from ${PoetryDao.TABLE_NAME} where uuid=#{uuid}`)@sql.ReturnType(Poetry)queryOne(@sql.Param('uuid') uuid: string): Promise<Poetry> {return sql.PromiseNull()}@sql.SqlQuery(`select count(*) from ${PoetryDao.TABLE_NAME} `)@sql.ReturnType(Number)queryCount(): Promise<Number> {return sql.PromiseNull()}@sql.SqlInsert(`insert into ${PoetryDao.TABLE_NAME} values (#{data.uuid},#{data.title},#{data.dynasty},#{data.author},#{data.introduction},#{data.text},#{data.textAlign},#{data.translation},#{data.rectify},#{data.searchKey})`)insert(@sql.Param('data') data: Poetry): Promise<void> {return sql.PromiseNull()}@sql.Transactional()async insertPoetryAll(list: Poetry[]) {for (let item of list) {await this.insert(item)}}
}

数据库管理:创建数据库、数据库升级

export class DatabaseManager {static readonly DATABASE_VERSION = 1static readonly DATABASE_NAME = 'poetry.db'static init(context: Context) {sql.dbHelper.initDb(context,DatabaseManager.DATABASE_NAME,DatabaseManager.DATABASE_VERSION,new DbOpenHelperImpl())}
}class DbOpenHelperImpl extends sql.DbOpenHelper {//创建数据库onCreate(db: relationalStore.RdbStore): void {db.executeSql(PoetryDao.SQL_CREATE_TABLE)}//升级数据onUpgrade(db: relationalStore.RdbStore, oldVersion: number, newVersion: number): void {}
}

最后在app启动的时候调用初始化方法

export default class EntryAbility extends UIAbility {onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');DatabaseManager.init(this.context)}
}

数据初始化和使用

将json格式的数据插入到数据库中

poetryDao: PoetryDao = new PoetryDao()new Promise<boolean>(async (resolve, reject) => {try {let count = await this.poetryDao.queryCount()if (!count) {let list = await (await import("resources/rawfile/poetry.json")).defaultlet poetryArray: Array<Poetry> = []for (let item of list) {let poetry = item as Poetrypoetry.uuid = util.generateRandomUUID()if (poetry.rectify) {poetry.rectify = JSON.stringify(poetry.rectify)}poetryArray.push(poetry)}this.poetryDao.insertPoetryAll(poetryArray)resolve(true)} else {resolve(false)}} catch (e) {reject(e)}
})

读取数据

//读取所有数据
new PoetryDao().queryList().then((value) => {})
//读取一条数据
new PoetryDao().queryOne("id").then((value) => {})

本文的技术设计和实现都是基于作者工作中的经验总结,如有错误,请留言指正,谢谢。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/857990.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

协作文档让销售工作事半功倍的秘密

在现代医疗销售行业中,高效协同是成功的关键。无论是销售方案的制定,客户拜访记录的共享,还是跨部门的合作,在线协作文档正在成为推动团队效率和精准度的核心工具。特别是在医疗销售这种信息密集型领域,在线协作文档不仅改变了团队的沟通方式,更重塑了销售流程,助力企业…

这款跨网文件安全交换系统 凭什么受到各行业的欢迎?

跨隔离网的文件传输交换,这是各个行业都会面临的场景,能解决传输问题的工具也不少,可为什么说有一款跨网文件安全交换系统,在各行业中应用都很广泛,受到各行业的欢迎呢?首先我们来看看跨网文件传输有哪些需求。一、跨网文件传输的普遍需求 跨网文件传输的普遍需求与挑战可…

模型上下文协议MCP

MCP(Model Context Protocol) Anthropic推出的一种开放协议,旨在统一LLM应用于外部数据源之间的通讯协议使之无缝集成,MCP提供了标准化协议使得LLM与所需要的上下文无缝衔接。使用MCP可以插件式为LLM的集成各种外部数据源。MCP概念上图为MCP官方所描述的MCP架构图,MCP Hosts…

TB级大文件如何安全又轻松地发送?FMail文件邮能实现

许多行业的企业存在着发送GB级、TB级大文件的业务场景,如半导体企业、汽车制造企业、跨境电商、地图测绘、生物科研等,都涉及大量大文件的内部及内外部流转需求。 在进行大文件传输时,企业常用的方式主要包括传统邮件、移动U盘拷贝、FTP传输,以及硬盘刻录通过车辆物理运输等…

客户不回消息?试试这些超实用沟通技巧

在销售与客户沟通过程中,我们时常会面临客户未回复消息的情境,这时应该如何妥善处理呢?以下提供了一些实用的沟通话术,旨在帮助你在各种情境下都能更有效地与客户取得联系。 初次接触后客户未回应 客户或许对初次接收的信息不感兴趣,又或是信息众多而被忽略。 推荐话术:“…

Spring事务管理深度解析-从实践到原理

事务管理在系统开发中是不可缺少的一部分,Spring提供了很好事务管理机制 分类 主要分为编程式事务和声明式事务两种。 编程式事务 是指在代码中手动的管理事务的提交、回滚等操作,代码侵入性比较强,如下示例: try {//TODO somethingtransactionManager.commit(status); } c…

创建用于预测序列的人工智能模型,设计模型架构。

上一篇:《创建用于预测序列的人工智能模型,设计数据集》 序言:在前一篇中,我们创建了用于训练人工智能模型的数据集。接下来,就要设计模型的架构了。其实,人工智能模型的开发关键并不在于代码量,而在于其中的数学原理和数据集(即人类经验)的深度与质量。 创建模型的架…

原来Flutter背后的布局原理是这样的

文章首发博客网站,由于格式解析问题,你可以前往阅读原文如果你是一名web开发者应该对于元素的布局不陌生,直接给目标元素定义尺寸就可以了,如css的width/height 、android的layout_width等等,但在flutter中同样的尺寸定义可能并不会呈现出自己想要的效果 扫码关注公众号,…

UML之包与包图

了解UML的人都知道UML中也有包的概念,包在UML中作用与面向对象编程语言中类似,它是管理对象的工具,也是解决对象同名冲突的手段。 在UML中,包的表示图形是一个左上角带标签的矩形,而包名可以标注于矩形中央(如下图所示,包名Package1位于矩形中央)或者左上角的标签之内。…

读数据保护:工作负载的可恢复性15公有云

公有云1. 云不是万能的 1.1. 其实根本就没有所谓的云,它只不过是别人的计算机而已 1.2. 云、SaaS以及Kubernetes,都没有改变数据保护与数据所有权的基本原则 1.3. 数据是你自己的,你必须负责给它们做备份1.3.1. 除非有人明确保证替你做备份,否则你还是必须自己做1.3.2. 就算…

Zed编辑器-Win中文汉化版(持续更新)

Zed编辑器-Win中文汉化版 介绍Zed 是一款专为团队协作设计的代码编辑器,由 Atom 编辑器的原作者主导开发。Zed 的核心目标是为开发者提供一个高效、流畅、且直观的编程环境,特别强调实时协作和团队合作。该编辑器由 Rust 语言编写,并内置了 rust-analyzer,主打“高性能”。…