在鸿蒙应用开发中,关系型数据库(RDB) 是结构化数据存储的核心方案。通过深度实践,其基于SQLite的轻量级实现不仅性能出色,更提供了强大的事务支持和类型安全。以下是关键经验总结:
三大核心优势:
- SQL兼容:完整支持SQL92标准语法
- 线程安全:内置多线程读写锁机制
- 加密存储:支持AES-256加密敏感数据
关系型数据库实战封装及使用:
- 在Utils目录下新建一个RdbUtils文件
import { relationalStore } from '@kit.ArkData'
import { BusinessError } from '@kit.BasicServicesKit'
import { common } from '@kit.AbilityKit'
export class RdbUtil {
private table: relationalStore.RdbStore | undefined = undefined
private tableName: string = ''
//注意,这里有时候会报非法上下文,将context导入一下就可以
constructor(tableName: string, tableSql: string,context:common.UIAbilityContext) {
this.tableName = tableName
relationalStore.getRdbStore(context, {
name: 'test',
securityLevel: relationalStore.SecurityLevel.S3
}, (err, store) => {
if (err) {
console.log('创建管理者对象:', JSON.stringify(err))
return
}
//创建表
store.executeSql(tableSql)
//保存
this.table = store
})
}
//获取数据
get<T>(columns: Array<string>): Promise<T> { // ['id', 'title', 'content']
return new Promise((resolve, reject) => {
const predicates = new relationalStore.RdbPredicates(this.tableName);
// predicates.equalTo('id', 1);
this.table?.query(predicates, columns, (err: BusinessError, resultSet) => {
if (err) {
console.log('查看错误:', JSON.stringify(err))
return reject([])
}
let temp: object[] = []
while (resultSet.goToNextRow()) {
temp.push(resultSet.getRow())
}
console.log('打印结果:', JSON.stringify(temp))
return resolve(temp as T)
})
})
}
//添加插入数据
put(data: relationalStore.ValuesBucket): Promise<number> { // number插入的行号 唯一编号
return new Promise((resolve, reject) => {
this.table?.insert(this.tableName, data, (err: BusinessError, rowId: number) => {
if (err) {
console.log('查看错误:', JSON.stringify(err))
return reject(0)
}
console.log('rowId ', rowId)
resolve(rowId)
})
})
}
//删除数据(传id)
del(id: number): Promise<number> { // 1-代表删除成功了 影响了1行 因为你就删除1行 0-代表删除失败 例如id=1第一次删除成后 再删除返回的就是0影响0行 因为数据不存在了
return new Promise((resolve, reject) => {
const predicates = new relationalStore.RdbPredicates(this.tableName);
predicates.equalTo('id', id);
this.table?.delete(predicates, (err: BusinessError, rows: number) => {
if (err) {
console.log('查看错误:', JSON.stringify(err))
return reject(0)
}
console.log('rows ', rows)
resolve(rows)
})
})
}
}
- 在entryAbility中创建表
const CollectTable = new RdbUtil('collect', `create table if not exists collect (
id integer primary key autoincrement,
title text,
img text
)`,this.context)
//保存
AppStorage.setOrCreate('CollectTable',CollectTable)
this.context.getApplicationContext().setColorMode(ConfigurationConstant.ColorMode.COLOR_MODE_NOT_SET);
this.onChangePagePath(want, 0)
hilog.info(DOMAIN, 'testTag', '%{public}s', 'Ability onCreate');
}
- 在页面使用 插入数据
//获取存储的表
Button.onClick( async ()=>{
//调用put方法,插入数据
await this.CollectTable.put({title:item.goods_name,img:item.goods_img})
})
获取数据
title:string
img:string
id:number
}
@Local collectlist:collectGood[]=[]
@Local CollectTable:RdbUtil=Object()
async aboutToAppear(){
this.CollectTable = AppStorage.get('CollectTable') as RdbUtil
//存储到表单中在页面遍历展示
this.collectlist = await this.CollectTable.get<collectGood[]>(['title','img','id'])
}
删除数据
this.collectlist.splice(index, 1);
//逻辑删除
this.CollectTable.del(item.id)
总结 鸿蒙关系型数据库通过SQL原生支持和ACID事务保障,完美适用于用户资料、交易记录、消息历史等结构化数据存储场景。结合其线程安全设计和加密能力,开发者可构建出既高效又安全的数据持久层,为应用提供坚实的数据基石。