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/' + customDir
isReadOnly: 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 = 1
static 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")).default
let poetryArray: Array<Poetry> = []
for (let item of list) {
let poetry = item as Poetry
poetry.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) => { })

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

HarmonyOS Next 入门实战 - 关系型数据库、smartdb的更多相关文章

  1. Sqoop2入门之导入关系型数据库数据到HDFS上(sqoop2-1.99.4版本)

    sqoop2-1.99.4和sqoop2-1.99.3版本操作略有不同:新版本中使用link代替了老版本的connection,其他使用类似. sqoop2-1.99.4环境搭建参见:Sqoop2环境 ...

  2. RDS关系型数据库 入门 01 创建关系型数据库实例【华为云分享】

    [摘要] 关系型数据库(Relational Database Service,简称RDS)是一种基于云计算平台的即开即用.稳定可靠.弹性伸缩.便捷管理的在线关系型数据库服务.RDS具有完善的性能监控 ...

  3. 非关系型数据库MongoDB入门

    本文分为以下四块简单介绍非关系型数据库MongoDB:1.MongoDB简介.2.MongoDB和关系数据库对比.3.MongoDB基本概念.4.mongo shell的使用以及对MongoDB的增删 ...

  4. MongoDB学习笔记(二:入门环境配置及与关系型数据库区别总结)

    一.下载及安装MongoDB MongoDB下载官网链接:http://www.mongodb.org/downloads 具体安装步骤教程:http://www.shouce.ren/api/vie ...

  5. [Python3网络爬虫开发实战] 5.3-非关系型数据库存储

    NoSQL,全称Not Only SQL,意为不仅仅是SQL,泛指非关系型数据库.NoSQL是基于键值对的,而且不需要经过SQL层的解析,数据之间没有耦合性,性能非常高. 非关系型数据库又可细分如下. ...

  6. NoSQL数据库技术实战-第1章 NoSQL的数据一致性 传统关系型数据库的ACID

    在看着章节的时候,我简单的回顾了一下关系型数据库的事务处理的ACID原则,其中原子性和持久性比较好理解.由于以前没有深入去研究.关于一致性和隔离性上我产生了疑问,在整理后分析如下:   一致性:书中所 ...

  7. Jmeter(七) - 从入门到精通 - 建立数据库测试计划实战<MySQL数据库>(详解教程)

    1.简介 在实际工作中,我们经常会听到数据库的性能和稳定性等等,这些有时候也需要测试工程师去评估和测试,上一篇文章宏哥主要介绍了jmeter连接和创建数据库测试计划的过程,宏哥在文中通过示例和代码非常 ...

  8. Spark入门实战系列--1.Spark及其生态圈简介

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .简介 1.1 Spark简介 年6月进入Apache成为孵化项目,8个月后成为Apache ...

  9. Spark入门实战系列--6.SparkSQL(上)--SparkSQL简介

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .SparkSQL的发展历程 1.1 Hive and Shark SparkSQL的前身是 ...

  10. JDBC+MySQL入门实战(实现CURD的例子)

    前言 hello我是bigsai,今天咱们进行JDBC+MySQL实战,非常适合初入门的小伙伴打开新的世界.实现一个增删改查(curd)的例子.先点赞再观看.帅哥靓女养成好习惯! 在这个案例进行之前, ...

随机推荐

  1. kotlin基础——>基本数据类型、控制流、返回和跳转

    1.对于数字的定义,支持java 8的下划线分割的方式 val a = 1_2_3 与 val a = 123 是相同的 2.如果要指定数字类型有两种方式 val a : Float = 1 或者 v ...

  2. 洛谷P1381单词背诵

    单词背诵 题目描述 灵梦有 \(n\) 个单词想要背,但她想通过一篇文章中的一段来记住这些单词. 文章由 \(m\) 个单词构成,她想在文章中找出连续的一段,其中包含最多的她想要背的单词(重复的只算一 ...

  3. 一、Tomcat基础知识与运行原理

    本章节为介绍如何安装Tomcat工具以及其主要架构知识概念,深入浅出让新人玩家理解为什么选择该容器以及该容器的优点 web服务器 概念 服务器:安装了服务器软件的计算机 服务器软件:接收用户的请求,处 ...

  4. 『玩转Streamlit』--环境配置

    尽管Streamlit的使用非常直观,但正确的环境配置对于充分发挥其潜力仍然至关重要. 本篇将介绍如何从头开始配置Streamlit环境,以及Streamlit开发过程中常用的几个命令. 最后通过一个 ...

  5. linux 基础(9)背景工作管理

    前景和背景工作管理 在 linux 中,进程以调用顺序构成一棵树,系统的初始程序是 systemd,然后一个程序又调用另一个程序.当你在 bash 里输入其他指令,这些指令就作为当前shell 的子进 ...

  6. 同步完善Docker常用操作命令

    镜像 images_name 表示镜像名 con_name表示容器名 #获取镜像 docker pull images_name #查看已有的docker镜像 docker images #删除镜像 ...

  7. 在 Kubernetes 中运行 Locust 与 Selenium:安装 Chrome 和 ChromeDriver

    在现代软件开发中,性能和用户体验是至关重要的,而负载测试和自动化测试可以帮助我们实现这一目标.在本文中,我们将讨论如何在 Kubernetes 环境中运行 Locust 和 Selenium,并详细介 ...

  8. openresty操作mongodb

    最近项目中使用openresty,需要通过openresty连接mongo,经过几番折腾终于有了一个结果,现将其记录下来,也感谢模块提供者 使用openresty操作mongo 1.引入第三方的模块 ...

  9. SSM基础知识

    SSM整合 前面我们已经把Mybatis.Spring和SpringMVC三个框架进行了学习,那现在我们把这三个框架整合在一起,来完成我们的业务功能开发,具体如何来整合,我们一步步来学习. 流程分析 ...

  10. vue2-vuex

    专门在 Vue 中实现集中式状态(数据)管理的一个 Vue 插件,对 vue 应 用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信 应用场景: 多个组 ...