当前位置: 首页 > news >正文

鸿蒙 —— 关系型数据库

建库建表

// entry/src/main/ets/database/AccountTagTable.ets
import { relationalStore } from '@kit.ArkData';

export interface TableData {
  id: number,
  tagName: string,
  tagImage: string,
  tagNumber: number,
  accountType: number
}

function bucket(data: TableData): relationalStore.ValuesBucket {
  let obj: relationalStore.ValuesBucket = {
    tagName: data.tagName,
    tagImage: data.tagImage,
    tagNumber: data.tagNumber,
    accountType: data.accountType
  }
  return obj
}

export default class AccountTagTable {
  private tableName: string = 'tagTable'
  // 表结构:tagTable (id, tagName, tagImage, tagNumber, accountType)
  private createTable = 'CREATE TABLE IF NOT EXISTS tagTable (id INTEGER PRIMARY KEY AUTOINCREMENT' +
    ', tagName Text, tagImage Text, tagNumber INTEGER, accountType INTEGER)';
  private rdbStore: relationalStore.RdbStore | undefined = undefined;

  // 建库建表
  getRdbStore(callback: Function) {
    const STORE_CONFIG :relationalStore.StoreConfig= { // 关系数据库配置
      name: 'Rdb.db', // 数据库文件名
      securityLevel: relationalStore.SecurityLevel.S3, // 数据库安全级别,
      allowRebuild: true // 指定数据库是否支持异常时自动删除,并重建一个空库空表
    };

    let context: Context = getContext(this) as Context
    relationalStore.getRdbStore(context, STORE_CONFIG, (err, store) => { // 建库:Rdb.db
      if (err) {
        console.error(`Failed to get RdbStore. Code:${err.code}, message:${err.message}`);
        return;
      }
      this.rdbStore = store

      // 当数据库创建时,数据库默认版本为0
      if (store.version === 0) {
        store.executeSql(this.createTable); // 建表
        // 设置数据库的版本,入参为大于0的整数
        store.version = 1;
      }

      callback()
    });
  }

  // 增
  insert(data: TableData, callback: Function) {
    const valuesBucket: relationalStore.ValuesBucket = bucket(data)
    if (this.rdbStore !== undefined) {
      this.rdbStore.insert(this.tableName, valuesBucket, (err) => {
        if (err) {
          console.error(`Insert failed, code is ${err.code}, message is ${err.message}`);
          return;
        }
        callback()
      })
    }
  }

  // 删
  delete(data: TableData, callback: Function) {
    let predicates = new relationalStore.RdbPredicates(this.tableName);
    predicates.equalTo('id', data.id);
    if (this.rdbStore !== undefined) {
      this.rdbStore.delete(predicates, (err) => {
        if (err) {
          console.error(`Delete failed, code is ${err.code}, message is ${err.message}`);
          return;
        }
        callback()
      })
    }
  }

  // 改
  update(data: TableData, callback: Function) {
    const valuesBucket: relationalStore.ValuesBucket = bucket(data)
    let predicates = new relationalStore.RdbPredicates(this.tableName);
    predicates.equalTo('id', data.id);
    if (this.rdbStore !== undefined) {
      this.rdbStore.update(valuesBucket, predicates, (err) => {
        if (err) {
          console.error(`Updated failed, code is ${err.code}, message is ${err.message}`);
          return;
        }
        callback()
      })
    }
  }

  // 查
  querySql(callback: Function) {
    if (this.rdbStore !== undefined) {
      this.rdbStore.querySql('SELECT * FROM tagTable ORDER BY tagNumber ASC', (err, resultSet) => {
        if (err) {
          console.error(`Query failed, code is ${err.code}, message is ${err.message}`);
          return;
        }
        const result: TableData[] = []
        // resultSet是一个数据集合的游标,默认指向第-1个记录,有效的数据从0开始。
        while (resultSet.goToNextRow()) {
          let tmp: TableData = {
            id: resultSet.getLong(resultSet.getColumnIndex("id")),
            tagName: resultSet.getString(resultSet.getColumnIndex("tagName")),
            tagImage: resultSet.getString(resultSet.getColumnIndex("tagImage")),
            tagNumber: resultSet.getLong(resultSet.getColumnIndex("tagNumber")),
            accountType: resultSet.getLong(resultSet.getColumnIndex("accountType"))
          }
          result.push(tmp)
        }
        callback(result)
        // 释放数据集的内存,若不释放可能会引起fd泄露与内存泄露
        resultSet.close();
      })
    }
  }

  // 从指定的数据库备份文件恢复数据库
  backup(callback: Function) {
    if (this.rdbStore != undefined) {
      this.rdbStore.backup("Backup.db", (err) => {
        if (err) {
          console.error(`Backup failed, code is ${err.code}, message is ${err.message}`);
          return;
        }
        callback()
      })
    }
  }

  // 从指定的数据库备份文件恢复数据库
  restore(callback: Function) {
    if (this.rdbStore != undefined) {
      this.rdbStore.restore('Backup.db', (err) => {
        console.log('112244')
        if (err) {
          console.error(`Restore failed, code is ${err.code}, message is ${err.message}`);
          return;
        }
        callback()
      })
    }
  }
}

使用

import AccountTagTable, { TableData } from '../database/AccountTagTable'

@Entry
@Component
struct Index {
  private rdb = new AccountTagTable()
  @State tableData: TableData = {
    id: -1,
    tagName: '',
    tagImage: '',
    tagNumber: 1,
    accountType: 0
  }

  aboutToAppear(): void {
    this.rdb.getRdbStore(() => {
      this.rdb.querySql((result: TableData[]) => {
        // 查询数据
      })
    })
  }
  
  build() {
  
  }
}
// 增
this.rdb.insert(this.tableData, () => {
   
})
// 删
this.rdb.delete(this.tableData, () => {
   
})
// 改
this.rdb.update(this.tableData, () => {
   
})
http://www.dtcms.com/a/111738.html

相关文章:

  • 本节课课堂总结
  • Linux系统编程:进程管理、内存对比与树莓派应用
  • 【AI学习】MCP的简单快速理解
  • 解决backtrader框架下日志ValueError: I/O operation on closed file.报错(jupyternotebook)
  • el-table固定表头,动态计算高度
  • 基础IO(linux)
  • 公司论坛数据构建情感标注数据集思考
  • 使用minio客户端mc工具迁移指定文件到本地
  • C++设计模式-策略模式:从基本介绍,内部原理、应用场景、使用方法,常见问题和解决方案进行深度解析
  • [GN] Python3基本数据类型 -- 与C的差异
  • 灭火器离位检测:智能视觉守护安全
  • Java异步编程实战:线框-管道模型的设计与实现
  • LabVIEW 中数字转字符串常用汇总
  • MoE Align Sort在医院AI医疗领域的前景分析(代码版)
  • Linux错误(6)X64向量指令访问地址未对齐引起SIGSEGV
  • 光流 | Farneback、Horn-Schunck、Lucas-Kanade、Lucas-Kanade DoG四种光流算法对比(附matlab源码)
  • web漏洞靶场学习分享
  • 19685 握手问题
  • 恒盾C#混淆加密卫士 - 混淆加密保护C#程序
  • 基于DrissionPage的Taptap热门游戏数据爬虫实战:从Requests到现代爬虫框架的迁移指南(含完整代码复制)
  • QML输入控件: TextArea的样式定制
  • 【python】速通笔记
  • AutoDL内网穿透、SSH连接本地VSCode
  • Windows10 中打开“网络 Internet”时状态页崩溃闪退解决方法
  • 计算机网络-TCP的拥塞控制
  • 软件工程面试题(二十六)
  • c++项目 网络聊天服务器 实现
  • 前端开发工厂模式的优缺点是什么?
  • 系统与网络安全------Windows系统安全(9)
  • YOLOv12 从预训练迈向自主训练,第一步数据准备