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

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

三大核心优势:

SQL兼容:完整支持SQL92标准语法

线程安全:内置多线程读写锁机制

加密存储:支持AES-256加密敏感数据

关系型数据库实战封装及使用:

  • 在Utils目录下新建一个RdbUtils文件

    //./src/main/ets/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(columns: Array): Promise { // ['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插入的行号  唯一编号
    
      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 { // 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中创建表

    onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
    
    
      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');
    }
    
  • 在页面使用
     插入数据

    //获取存储的表
    
    @State CollectTable:RdbUtil = AppStorage.get('CollectTable') as RdbUtil
    
    Button.onClick( async ()=>{
    
    //调用put方法,插入数据
    
     await this.CollectTable.put({title:item.goods_name,img:item.goods_img})
    
    })
    

    获取数据

    export interface collectGood{
    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(['title','img','id'])
    
    }
    

    删除数据

    //UI删除
    this.collectlist.splice(index, 1);
    //逻辑删除
    this.CollectTable.del(item.id)

    总结
    鸿蒙关系型数据库通过SQL原生支持和ACID事务保障,完美适用于用户资料、交易记录、消息历史等结构化数据存储场景。结合其线程安全设计和加密能力,开发者可构建出既高效又安全的数据持久层,为应用提供坚实的数据基石。

你可能感兴趣的:(数据库harmonyos)