鸿蒙关系型数据库实战:高效数据存储与管理

99 阅读2分钟

​ 在鸿蒙应用开发中,关系型数据库(RDB) 是结构化数据存储的核心方案。通过深度实践,其基于SQLite的轻量级实现不仅性能出色,更提供了强大的事务支持和类型安全。以下是关键经验总结:

三大核心优势:

  1. SQL兼容:完整支持SQL92标准语法
  2. 线程安全:内置多线程读写锁机制
  3. 加密存储:支持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事务保障,完美适用于用户资料、交易记录、消息历史等结构化数据存储场景。结合其线程安全设计和加密能力,开发者可构建出既高效又安全的数据持久层,为应用提供坚实的数据基石。