HarmoneyOS的关系型数据库基于SQLite组件,适用于存储包含复杂关系数据的场景,比如一个班级的学生信息,需要包括姓名、学号、各科成绩等,又或者公司的雇员信息,需要包括姓名、工号、职位等,由于数据之间有较强的对应关系,复杂程度比键值型数据更高,此时需要使用关系型数据库来持久化保存数据。
机制关系如下图
但是内置的数据库限制较多,最大的一条限制就是插入数据不能超过2MB,超过这个大小,插入成果,读取失败。
其他的限制则包括
1、支持的基本数据类型:number、string、二进制类型数据、boolean。
2、同一时间只能支持一个写操作
3、数据库中4个读连接和1个写链接,线程获取到空闲读连续时,即可以进行读取操作。当没有空闲读连接且有空闲写连接时,会将写连接当做读连接来使用。
嗯,那我们首先试试封装一个属于自己的HarmoneyOS数据库吧。
1、导入模块
import { relationalStore } from '@kit.ArkData' //关系型数据库模块
import { promptAction } from '@kit.ArkUI' //提示模块
2、创建数据库
在这一步之前呢得用一个类将其包裹起来,我这用的名字,就用PrivacyDB了。
class PrivacyDB{
private store: relationalStore.RdbStore | null = null //操作实例
// 指定表格的名称
private tableName = 'PRIVACY_NOTE'
//创建数据库
async CreateDateBase() {
try {
this.store = await relationalStore.getRdbStore(getContext(), {
name: this.tableName, // 数据库名称
securityLevel: relationalStore.SecurityLevel.S1 // 安全等级
})
promptAction.showToast({ message: "数据库创建成功" })
} catch (e) {
promptAction.showToast({ message: "数据库创建失败" + e.message })
}
}
}
3、创建数据表
既然有库,那肯定要有表,在这里呢,我的表名在上面就已经声明结束了,所以直接调用即可,而对于创建表内的KEY主键操作字段,与Mysql很类似。
async createTable() { //异步返回
try {
const store = await this.getRdbStore()
const sqlCreatteTable = `CREATE TABLE IF NOT EXISTS ${this.tableName} (
id INTEGER PRIMARY KEY AUTOINCREMENT, //表内字段,id表示编号,自增
title TEXT NOT NULL, //title表示标题,必填
content TEXT NOT NULL, //content表示内容非空,必填
date_added INTEGER NOT NULL //date_added持续时间整型非空,必填
)`
// 2 执行 sql 创建数据表
//RdbStore
// 提供管理关系数据库(RDB)方法的接口。
//
// 在使用以下相关接口前,请使用executeSql接口初始化数据库表结构和相关数据。
await store.executeSql(sqlCreatteTable)
return true
} catch (e) {
return false
}
}
4、查询全部数据
// 返回值 查询不到 返回数组 空数组
async query() {
try {
const store = await this.getRdbStore()
//getRdbStore获得一个相关的RdbStore,操作关系型数据库
const predicates = new relationalStore.RdbPredicates(this.tableName)
//RdbPredicates表示关系型数据库(RDB)的谓词。该类确定RDB中条件表达式的值是true还是false。
const resultSet = await store.query(predicates)
//query表示查询
const list: PrivacyNoteDBInfo[] = []
//假设存在一个列表用于存储数据,只要存在就不断往下一行查询并放入
while (resultSet.goToNextRow()) {
const data: PrivacyNoteDBInfo = {
id: resultSet.getLong(resultSet.getColumnIndex("id")),
title: resultSet.getString(resultSet.getColumnIndex("title")),
content: resultSet.getString(resultSet.getColumnIndex("content")),
date_added: resultSet.getLong(resultSet.getColumnIndex("date_added")),
}
list. Push(data)
}
resultSet.close()
return list
} catch (e) {
return []
}
}
插入一条数据
async insert(item: PrivacyNoteDBInfo) {
const store = await this.getRdbStore()
const rowId = await store.insert(this.tableName, item)
//item可替换为
// const date: PrivacyNoteDBInfo = {
// id: null,
// title: '隐私笔记' + Date.now(),
// content: '笔记内容' + Date.now(),
// date_added: Date.now()
// }
return rowId !== -1 ? true : false
}
当然,还有很多的数据库操作,排序,更改,匹配等,都可以基于这个自己的数据库来拓展