openharmony开发最新4.0版本---数据库连接(二)(基于api10,devstudio4.0) 中relationalStore的使用

这篇具有很好参考价值的文章主要介绍了openharmony开发最新4.0版本---数据库连接(二)(基于api10,devstudio4.0) 中relationalStore的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

如下代码是一个工具类,可以自己导入到自己项目中,在入口文件中初始化即可使用,使用示例放在下节中

import relationalStore from '@ohos.data.relationalStore'
import common from '@ohos.app.ability.common';
import { BusinessError } from '@ohos.base';
import { ValuesBucket, ValueType } from '@ohos.data.ValuesBucket';

const TAG: string = '[RDBUtil]'

class RDBUtil {
  private context: common.UIAbilityContext | undefined = undefined
  // 存储已创建的RdbStore
  private rdbMap = new Map<string,relationalStore.RdbStore>()
  private currentRDB: string = 'default'

  init(context: common.UIAbilityContext) {
    this.context = context
  }

  /**
   * 创建数据库/获取连接
   * @param rdbName
   * @param config
   * @returns
   */
  async createRDB(rdbName: string, config ?: relationalStore.StoreConfig): Promise<relationalStore.RdbStore> {
    let promise: Promise<relationalStore.RdbStore> = new Promise(async (resolve, reject) => {
      if (!this.context) {
        console.error(TAG, '  (init) ERROR => Context 未获取')
        reject(TAG + '  (init) ERROR => Context 未获取')
      }
      this.currentRDB = rdbName
      const STORE_CONFIG: relationalStore.StoreConfig = config ? config : {name: rdbName, securityLevel: 1}
      try {
        let rdb = this.rdbMap.get(rdbName)
        if (!rdb) {
          rdb = await relationalStore.getRdbStore(this.context, STORE_CONFIG)
          this.rdbMap.set(rdbName, rdb)
        }
        console.info(TAG, `  (createRDB)  SUCCESS TO CREATE: ${rdbName} => 创建连接成功`)
        resolve(rdb)
      } catch (err) {
        let code = (err as BusinessError).code
        let message = (err as BusinessError).message
        console.error(TAG, `  (createRDB)  FAIL TO CREATE: ${rdbName} => code: ${code}, message: ${message}`)
        reject(err as BusinessError)
      }
    })
    return promise
  }

  /**
   * 获取/切换 RDB数据库
   * @param rdbName
   * @returns RdbStore
   */
  async getConnection(rdbName: string): Promise<relationalStore.RdbStore> {
    try {
      this.currentRDB = rdbName
      let rdb = this.rdbMap.get(rdbName)
      if (!rdb) {
        console.error(TAG, `  (getConnection)   FAIL TO GET => ${this.currentRDB} RDB连接不存在 重新创建`)
        rdb = await this.createRDB(rdbName)
      }
      console.info(TAG, `  (getConnection)   SUCCESS TO GET => ${this.currentRDB} RDB连接获取成功`)
      return Promise.resolve(rdb)
    } catch (err) {
      let code = (err as BusinessError).code
      let message = (err as BusinessError).message
      console.error(TAG, `  (getConnection)  FAIL TO GET: ${this.currentRDB} => code: ${code}, message: ${message}`)
      return Promise.reject(err as BusinessError)
    }
  }

  /**
   * 插入对象
   * @param tableName
   * @param obj
   * @returns
   */
  async insert <T> (tableName: string, obj: T): Promise<number> {
    try {
      // 默认使用最近一次连接
      let rdb = this.rdbMap.get(this.currentRDB)
      if (!rdb) {
        console.error(TAG, `  (insert)   FAIL TO INSERT => ${this.currentRDB} 未获取RDB连接`)
        return Promise.reject(TAG + `  (insert)   FAIL TO INSERT => ${this.currentRDB} 未获取RDB连接`)
      }
      let value: ValuesBucket = this.obj2ValueBucket <T> (obj)
      let insertNum: number = await rdb.insert(tableName, value)
      console.info(TAG, `  (insert)   SUCCESS TO INSERT => ${this.currentRDB} ${tableName} INSERT ${insertNum}`)
      return Promise.resolve(insertNum)
    } catch (err) {
      let code = (err as BusinessError).code
      let message = (err as BusinessError).message
      console.error(TAG, `  (insert)  FAIL TO INSERT: ${this.currentRDB} => code: ${code}, message: ${message}`)
      return Promise.reject(err as BusinessError)
    }
  }

  /**
   * 批量插入数组
   * @param tableName
   * @param arr
   * @returns 插入成功数量
   */
  async batchInsert <T> (tableName: string, arr: T[]): Promise<number> {
    try {
      // 默认使用最近一次连接
      let rdb = this.rdbMap.get(this.currentRDB)
      let values: ValuesBucket[] = this.array2ValueBuckets <T> (arr)
      if (!rdb) {
        console.error(TAG, `  (batchInsert)   FAIL TO BATCHINSERT => ${this.currentRDB} 未获取RDB连接`)
        return Promise.reject(TAG + `  (batchInsert)   FAIL TO BATCHINSERT => ${this.currentRDB} 未获取RDB连接`)
      }
      let insertNum: number = await rdb.batchInsert(tableName, values)
      console.info(TAG, `  (batchInsert)   SUCCESS TO BATCHINSERT => ${this.currentRDB} ${tableName} BATCHINSERT ${insertNum}}`)
      return Promise.resolve(insertNum)
    } catch (err) {
      let code = (err as BusinessError).code
      let message = (err as BusinessError).message
      console.error(TAG, `  (batchInsert)  FAIL TO BATCHINSERT: ${this.currentRDB} => code: ${code}, message: ${message}`)
      return Promise.reject(err as BusinessError)
    }
  }

  /**
   * 查询
   * @param tableName
   * @param id
   * @param columns
   * @returns 对象
   */
  async queryById <T> (tableName: string, id: number|string, columns ?: Array<string>): Promise<T> {
    try {
      // 默认使用最近一次连接
      let rdb = this.rdbMap.get(this.currentRDB)
      if (!rdb) {
        console.error(TAG, `  (queryById)   FAIL TO QUERY => ${this.currentRDB} 未获取RDB连接`)
        return Promise.reject(TAG +  `  (queryById)   FAIL TO QUERY => ${this.currentRDB} 未获取RDB连接`)
      }
      let predicates = new relationalStore.RdbPredicates(tableName)
      predicates.equalTo('id', id)
      let resultSet: relationalStore.ResultSet
      if (columns) {
        resultSet = await rdb.query(predicates, columns)
      } else {
        resultSet = await rdb.query(predicates)
      }
      let arr: T[] = this.resultSet2Array <T> (resultSet)
      resultSet.close()
      if (arr.length == 0) {
        console.error(TAG, `  (queryById)   FAIL TO QUERY => 该表未查询到数据`)
        return Promise.reject(null)
      }
      console.info(TAG, `  (queryById)   SUCCESS TO QUERY => ${JSON.stringify(arr)}`)
      return Promise.resolve(arr[0])
    } catch (err) {
      let code = (err as BusinessError).code
      let message = (err as BusinessError).message
      console.error(TAG, `  (queryById)  FAIL TO QUERY: ${this.currentRDB} => code: ${code}, message: ${message}`)
      return Promise.reject(err as BusinessError)
    }
  }

  /**
   * 批量查询
   * @param predicates
   * @param columns
   * @returns 所有数据 => 数组
   */
  async queryArray <T> (predicates: relationalStore.RdbPredicates, columns ?: Array<string>): Promise<T[]> {
    try {
      // 默认使用最近一次连接
      let rdb = this.rdbMap.get(this.currentRDB)
      if (!rdb) {
        console.error(TAG, `  (queryArray)   FAIL TO QUERY => ${this.currentRDB} 未获取RDB连接`)
        return Promise.reject(TAG +  `  (queryArray)   FAIL TO QUERY => ${this.currentRDB} 未获取RDB连接`)
      }
      let resultSet: relationalStore.ResultSet
      if (columns) {
        resultSet = await rdb.query(predicates, columns)
      } else {
        resultSet = await rdb.query(predicates)
      }
      let arr: T[] = this.resultSet2Array <T> (resultSet)
      resultSet.close()
      if (arr.length == 0) {
        console.error(TAG, `  (queryArray)   FAIL TO QUERY => 该表未查询到数据`)
        return Promise.resolve(arr)
      }
      console.info(TAG, `  (queryArray)   SUCCESS TO QUERY => ${JSON.stringify(arr)}`)
      return Promise.resolve(arr)
    } catch (err) {
      let code = (err as BusinessError).code
      let message = (err as BusinessError).message
      console.error(TAG, `  (queryArray)  FAIL TO QUERY: ${this.currentRDB} => code: ${code}, message: ${message}`)
      return Promise.reject(err as BusinessError)
    }
  }

  /**
   * 更新数据
   * @param obj
   * @param predicates
   * @returns 更新数量
   */
  async update <T> (obj: T, predicates: relationalStore.RdbPredicates): Promise<number> {
    try {
      // 默认使用最近一次连接
      let rdb = this.rdbMap.get(this.currentRDB)
      if (!rdb) {
        console.error(TAG, `  (update)   FAIL TO UPDATE => ${this.currentRDB} 未获取RDB连接`)
        return Promise.reject(TAG + `  (update)   FAIL TO UPDATE => ${this.currentRDB} 未获取RDB连接`)
      }
      let value = this.obj2ValueBucket <T>(obj)
      let updateNum = await rdb.update(value, predicates)
      console.info(TAG, `  (update)   SUCCESS TO UPDATE => ${this.currentRDB} UPDATE ${updateNum}}`)
      return Promise.resolve(updateNum)
    } catch (err) {
      let code = (err as BusinessError).code
      let message = (err as BusinessError).message
      console.error(TAG, `  (update)  FAIL TO UPDATE: ${this.currentRDB} => code: ${code}, message: ${message}`)
      return Promise.reject(err as BusinessError)
    }
  }

  /**
   * 更新数据 ById
   * @param obj
   * @param predicates
   * @returns 成功更新数量
   */
  async updateById <T> (tableName: string, id: number|string, obj: T): Promise<number> {
    try {
      let value = this.obj2ValueBucket <T>(obj)
      let predicates = new relationalStore.RdbPredicates(tableName)
      predicates.equalTo('id', id)
      let updateNum = await this.update(value, predicates)
      console.info(TAG, `  (updateById)   SUCCESS TO UPDATE => ${this.currentRDB} UPDATE ${updateNum}}`)
      return Promise.resolve(updateNum)
    } catch (err) {
      let code = (err as BusinessError).code
      let message = (err as BusinessError).message
      console.error(TAG, `  (updateById)  FAIL TO UPDATE: ${this.currentRDB} => code: ${code}, message: ${message}`)
      return Promise.reject(err as BusinessError)
    }
  }

  /**
   * 删除数据
   * @param obj
   * @param predicates
   * @returns 删除数量
   */
  async delete(predicates: relationalStore.RdbPredicates) :Promise<number> {
    try {
      // 默认使用最近一次连接
      let rdb = this.rdbMap.get(this.currentRDB)
      if (!rdb) {
        console.error(TAG, `  (delete)   FAIL TO DELETE => ${this.currentRDB} 未获取RDB连接`)
        return Promise.reject(TAG + `  (update)   FAIL TO DELETE => ${this.currentRDB} 未获取RDB连接`)
      }
      let deleteNum = await rdb.delete(predicates)
      console.info(TAG, `  (delete)   SUCCESS TO DELETE => ${this.currentRDB} DELETE ${deleteNum}}`)
      return Promise.resolve(deleteNum)
    } catch (err) {
      let code = (err as BusinessError).code
      let message = (err as BusinessError).message
      console.error(TAG, `  (delete)  FAIL TO DELETE: ${this.currentRDB} => code: ${code}, message: ${message}`)
      return Promise.reject(err as BusinessError)
    }
  }

  /**
   * 删除数据 ById
   * @param obj
   * @param predicates
   * @returns 成功删除数量
   */
  async deleteById(tableName: string, id: number|string) :Promise<number> {
    try {
      let predicates = new relationalStore.RdbPredicates(tableName)
      predicates.equalTo('id', id)
      let deleteNum = await this.delete(predicates)
      console.info(TAG, `  (deleteById)   SUCCESS TO DELETE => ${this.currentRDB} DELETE ${deleteNum}}`)
      return Promise.resolve(deleteNum)
    } catch (err) {
      let code = (err as BusinessError).code
      let message = (err as BusinessError).message
      console.error(TAG, `  (deleteById)  FAIL TO DELETE: ${this.currentRDB} => code: ${code}, message: ${message}`)
      return Promise.reject(err as BusinessError)
    }
  }

  /**
   * ResultSet => Array
   * @param resultSet
   * @returns 数组
   */
  private resultSet2Array <T> (resultSet: relationalStore.ResultSet) : Array<T> {
    let arr: T[] = []
    if (resultSet.rowCount == 0 || resultSet.columnCount == 0){
      console.error(TAG, `  (resultSet2Array)  FAIL TO TRANSFER: ${this.currentRDB} => resultSet 为 null`)
      return []
    }
    resultSet.goToFirstRow()
    let str : string = '{'
    do {
      for (let index = 0; index < resultSet.columnCount; index++) {
        str += `"${resultSet.getColumnName(index)}":"${resultSet.getString(index)}"`
        if (index != resultSet.columnCount - 1) {
          str += ','
        }
      }
      str +='}'
      let obj: T = JSON.parse(str)
      arr.push(obj)
      console.log(JSON.stringify(obj))
      str = '{'
    } while (resultSet.goToNextRow())
    return arr
  }

  /**
   * Object => ValueBucket
   * @param arr
   * @returns ValueBucket
   */
  private obj2ValueBucket <T> (obj: T) {
    let valuesBucket: ValuesBucket = {}
    // 获取对象属性/成员变量
    let keys: string[] = Object.keys(obj)
    for (let key of keys) {
      // 获取键值对
      let value: ValueType = obj[key]
      // 将键值对添加到ValuesBucket对象中
      valuesBucket[key] = value
    }
    return valuesBucket
  }

  /**
   * Array => ValueBucket[]
   * @param arr
   * @returns ValueBucket[]
   */
  private array2ValueBuckets <T> (arr: Array<T>) {
    let valuesBuckets: ValuesBucket[] = []
    // 遍历对象集合
    for (let obj of arr) {
      valuesBuckets.push(this.obj2ValueBucket <T> (obj))
    }
    // 返回ValuesBucket对象
    return valuesBuckets
  }
}


export let rdbUtil: RDBUtil = new RDBUtil()
 文章来源地址https://www.toymoban.com/news/detail-799901.html

到了这里,关于openharmony开发最新4.0版本---数据库连接(二)(基于api10,devstudio4.0) 中relationalStore的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【postgresql 基础入门】pgAdmin4 最新图形化客户端的安装使用,值得推荐的数据库开发工具,还有大家喜欢的暗黑主题

    【postgresql 基础入门】pgAdmin4 最新图形化客户端的安装使用,值得推荐的数据库开发工具,还有大家喜欢的暗黑主题

    ​ 专栏内容 : postgresql内核源码分析 手写数据库toadb 并发编程 ​ 开源贡献 : toadb开源库 个人主页 :我的主页 管理社区 :开源数据库 座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物. 入门准备 postgrersql基础架构 快速使用 初始化集群 数据库服务管理 psql客户

    2024年02月07日
    浏览(30)
  • Microsoft Jet 4.0 VC++中通过ADO中的_RecordsetPtr操作数据库:增删改查

    _RecordsetPtr智能指针,它是专门为通过记录集操作数据库而设立的指针,通过该接口可以对数据库的表内的记录、字段等进行各种操作。 要搞清楚:数据库和ADO的记录集是两个不同的概念,是存在于不同物理位置的两个存储空间。记录集相当于是实际数据的一份拷贝。正因为记录

    2024年02月15日
    浏览(10)
  • Qt+MySql开发笔记:Qt5.9.3的msvc2017x64版本编译MySql8.0.16版本驱动并Demo连接数据库测试

    Qt+MySql开发笔记:Qt5.9.3的msvc2017x64版本编译MySql8.0.16版本驱动并Demo连接数据库测试

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/130381428 红胖子网络科技博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…   mysql驱动版本msvc2015x32版本调

    2023年04月26日
    浏览(33)
  • MySQL数据库介绍流程(最新mysql)

    MySQL数据库介绍流程(最新mysql)

    1、下载地址: http://dev,mysql.com/downloads/windows/installer/8.0html 2、就是直接搜索:mysql官方  msyql官方网站                              这里就安装成功                点击鼠标右键,点击属性   没有话在这里,搜索高级系统打开这个           安装mysql找到文件        

    2024年02月13日
    浏览(15)
  • 2023年07月数据库流行度最新排名

    2023年07月数据库流行度最新排名

    一个数据库被搜索的次数越多,这个数据库就被认为越受欢迎。这是一个领先指标。原始数据来自谷歌Trends 如果您相信集体智慧,那么TOP DB索引可以帮助您决定在软件开发项目中使用哪个数据库 排名 数据库 占比 占比改变 1 Oracle 27.19% -0.10% 2 MySQL 18.58% -0.50% 3 SQL Server 12.39% +

    2024年02月12日
    浏览(11)
  • 数据库毕业设计参考文献最新合集

    随着国民经济的飞速发展,信息管理系统在各行各业的应用不断融合深化,但伴随而来的安全风险也在持续增加.数据库系统作为信息管理系统的核心部分,它的安全直接关系到整个信息管理系统的安全.下面是搜素整理的数据库毕业设计参考文献,供大家阅读指正。 数据库毕业设

    2024年02月07日
    浏览(13)
  • Sql Server高版本数据库数据备份后还原到低版本数据库

    Sql Server高版本数据库数据备份后还原到低版本数据库

    如果需要将高版本的Sql Server2019数据库还原到Sql Server低版本(2012,2008等)数据库,通过以下方法可以顺利还原 通过高版本生成sql脚本在低版本执行,并且数据也能保留 步骤:选择数据库右键 点击任务 生成脚本 在设置脚本编写选项时,选择高级,编写脚本数据类型选择为架构和数

    2024年02月09日
    浏览(53)
  • 阿里云RDS关系型数据库详细介绍_多版本数据库说明

    阿里云RDS关系型数据库详细介绍_多版本数据库说明

    阿里云RDS关系型数据库大全,关系型数据库包括MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等,NoSQL数据库如Redis、Tair、Lindorm和MongoDB,阿里云百科分享阿里云RDS关系型数据库大全: 目录 阿里云RDS关系型数据库大全 RDS关系型数据库大全 云原生数据库 PolarDB MySQL 版 云原生数据库

    2024年02月07日
    浏览(13)
  • (8版本)mysql数据库安装教程(自用保存)

    (8版本)mysql数据库安装教程(自用保存)

    博主简介:想进大厂的打工人 博主主页: @xyk: 所属专栏: mysql 参考csdn大神们的文章, 总结出来的详细用法~~~  目录 文章目录 一、下载MySQL8.0.33 二、配置初始化文件my.ini(重点) 三、初始化MySQL 四、安装MySQL服务并启动 + 修改密码 4.1 安装MySQL服务 4.2 启动MySQL服务 4.3 连接Mys

    2024年02月07日
    浏览(14)
  • Flutter 本地SQLite数据库版本升级处理

    前言 上一篇我们介绍了使用 sqflite 这个数据库工具在 Flutter 的应用中建立本地数据库的实例应用。了解过数据库的同学应该会知道,数据表结构是可能发生改变的。但是 App 的版本会有碎片化的存在,如果数据表结构发生了改变,就需要对旧版本 App 的数据表结构进行同步,

    2023年04月09日
    浏览(13)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包