应用数据持久化
概念:应用数据持久化,是指应用将内存中的数据通过文件或数据库的形式保存到设备上。
HarmonyOS 标准系统支持典型的存储数据形态,包括用户首选项、键值型数据库、关系型数据库
这里主要介绍关系型数据库
关系型数据库(Relational Database,RDB)是一种基于关系模型来管理数据的数据库。关系型数据库基于SQLite组件提供了一套完整的对本地数据库进行管理的机制,对外提供了一系列的增、删、改、查等接口,也可以直接运行用户输入的SQL语句来满足复杂的场景需要。不支持Worker线程。
鸿蒙os中的关系型数据库SQLite
它支持的基本数据类型:number、string、二进制类型数据、boolean。为保证插入并读取数据成功,建议一条数据不要超过2M。超出该大小,插入成功,读取失败。
该模块提供以下关系型数据库相关的常用功能:
- RdbPredicates: 数据库中用来代表数据实体的性质、特征或者数据实体之间关系的词项,主要用来定义数据库的操作条件。
- RdbStore:提供管理关系数据库(RDB)方法的接口。
- ResultSet:提供用户调用关系型数据库查询接口之后返回的结果集合
关键概念
/ 关系型数据库基于SQLite // 关键概念: // 1:谓词(predicates): // RdbPredicates 为构造函数,需要通过 new 关键词创建,参数为数据库表名。 // const predicates = new relationalStore.RdbPredicates(this.tableName)
// 2:结果集(ResultSet):指用户查询之后的结果集合,可以对数据进行访问。结果集提供了灵活的数据访问方式,可以更方便地拿到用户想要的数据,包含的属性: // columnNames Array<string> 获取结果集中所有列的名称。 // columnCount number 获取结果集中的列数。 // rowCount number 获取结果集中的行数。
数据库管理类的封装
// 包括: // 数据库,数据库表的创建、删除、修改、查询 // 表的字段、行数和列数查询 / /根据id删除/查询表 //数据库语句的创建---可以利用AI生成需要的表字段
//导入相关模块
import { relationalStore, ValuesBucket } from '@kit.ArkData'
// 表的字段类型,需要继承ValueBucket接口
interface IdbTabType extends ValuesBucket {
id: number,
title: string,
content: string,
date_added: number
}
export class SQLiteDBManager {
static store: relationalStore.RdbStore | null = null// 操作数据库的实例
static tableName = 'PRIVACY_NOTE' //数据库表名
// 创建数据库的语句
static sqlCreate = `CREATE TABLE IF NOT EXISTS ${this.tableName} (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
content TEXT NOT NULL,
date_added INTEGER NOT NULL
)`
// 获取实例
async getStoreInstance() {
try {
if (SQLiteDBManager.store) { // 如果数据库实例已存在,直接返回,没有才创建实例
return SQLiteDBManager.store
}
const store = await relationalStore.getRdbStore(getContext(), {
// 创建隐私笔记的数据库实例
name: SQLiteDBManager.tableName + '.db', // 数据库名称
securityLevel: relationalStore.SecurityLevel.S1 // 安全等级
})
store.executeSql(SQLiteDBManager.sqlCreate) // 执行创建语句
SQLiteDBManager.store = store // 存储起来方便下次直接获取
return SQLiteDBManager.store // 返回 store 实例
} catch (err) {
return Promise.reject('initDB error')
}
}
// 新增
async insert(item: IdbTabType) { //item是需要插入的数据
const store = await this.getStoreInstance()
const rowId = await store.insert(SQLiteDBManager.tableName, item)
return rowId > 0 ? Promise.resolve(rowId) : Promise.reject('insert error')
}
// 删除(传入ID则根据ID删除对应的数据)
async delete(id: number) {
const store = await this.getStoreInstance()
const predicates = new relationalStore.RdbPredicates(SQLiteDBManager.tableName)
predicates.equalTo('id', id)
// 删除完成,返回受影响的行数
const rowCount = await store.delete(predicates)
return rowCount ? Promise.resolve(rowCount) : Promise.reject('delete error')
}
// 更新
async update(item: IdbTabType) {
if (!item.id) { // 如果没有 id 直接退出
return Promise.reject('id error')
}
const store = await this.getStoreInstance()
const predicates = new relationalStore.RdbPredicates(SQLiteDBManager.tableName)
predicates.equalTo('id', item.id)
// 更新完成,返回受影响的行数
const rowCount = await store.update(item, predicates)
return rowCount ? Promise.resolve(rowCount) : Promise.reject('update error')
}
// 查询(传入ID则根据ID查询数据)
async query(id?: number) {
const store = await this.getStoreInstance()
const predicates = new relationalStore.RdbPredicates(SQLiteDBManager.tableName)
predicates.orderByDesc('id') // 倒序排列
if (id) { // 如果有 id,添加 id 作为查询条件
predicates.equalTo('id', id)
}
const resultSet = await store.query(predicates)
const list: IdbTabType[] = [] //声明一个list数组接收数据
while (resultSet.goToNextRow()) { //指针进行每一行的查询
// 获取数据
const data: IdbTabType = {
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 // 循环结束后,返回所有数据
}
}