鸿蒙harmony--数据库sqlite详解

news2024/9/23 1:32:31

今天是1月20号星期六,早安,岁末大寒至,静后春归来。愿他乡故人,漂泊有归宿,前程有奔赴,愿人间不寒,温暖常伴,诸事顺利,喜乐长安。 

目录

一,定义

二,运作机制

三,约束限制

四,接口说明

五,开发步骤

5.1 获取数据库

5.2 创建数据库表

5.3 数据库升降级

5.4插入数据

5.5 更新数据

5.6 删除数据

5.7删除数据库

一,定义

关系型数据库基于SQLite组件,适用于存储包含复杂关系数据的场景,比如一个班级的学生信息,需要包括姓名、学号、各科成绩等,又或者公司的雇员信息,需要包括姓名、工号、职位等,由于数据之间有较强的对应关系,复杂程度比键值型数据更高,此时需要使用关系型数据库来持久化保存数据。

谓词:数据库中用来代表数据实体的性质、特征或者数据实体之间关系的词项,主要用来定义数据库的操作条件。

结果集:指用户查询之后的结果集合,可以对数据进行访问。结果集提供了灵活的数据访问方式,可以更方便地拿到用户想要的数据。

二,运作机制

关系型数据库对应用提供通用的操作接口,底层使用SQLite作为持久化存储引擎,支持SQLite具有的数据库特性,包括但不限于事务、索引、视图、触发器、外键、参数化查询和预编译SQL语句。

三,约束限制

1,系统默认日志方式是WAL(Write Ahead Log)模式,系统默认落盘方式是FULL模式。

2,数据库中有4个读连接和1个写连接,线程获取到空闲读连接时,即可进行读取操作。当没有空闲读连接且有空闲写连接时,会将写连接当做读连接来使用。

3,为保证数据的准确性,数据库同一时间只能支持一个写操作。

4,当应用被卸载完成后,设备上的相关数据库文件及临时文件会被自动清除。

5,ArkTS侧支持的基本数据类型:number、string、二进制类型数据、boolean。

6,为保证插入并读取数据成功,建议一条数据不要超过2M。超出该大小,插入成功,读取失败。

四,接口说明

接口名称描述
getRdbStore(context: Context, config: StoreConfig, callback: AsyncCallback<RdbStore>): void获得一个相关的RdbStore,操作关系型数据库,用户可以根据自己的需求配置RdbStore的参数,然后通过RdbStore调用相关接口可以执行相关的数据操作。
executeSql(sql: string, bindArgs: Array<ValueType>, callback: AsyncCallback<void>):void执行包含指定参数但不返回值的SQL语句。
insert(table: string, values: ValuesBucket, callback: AsyncCallback<number>):void向目标表中插入一行数据。
update(values: ValuesBucket, predicates: RdbPredicates, callback: AsyncCallback<number>):void根据RdbPredicates的指定实例对象更新数据库中的数据。
delete(predicates: RdbPredicates, callback: AsyncCallback<number>):void根据RdbPredicates的指定实例对象从数据库中删除数据。
query(predicates: RdbPredicates, columns: Array<string>, callback: AsyncCallback<ResultSet>):void根据指定条件查询数据库中的数据。
deleteRdbStore(context: Context, name: string, callback: AsyncCallback<void>): void删除数据库。

五,开发步骤

5.1 获取数据库

import relationalStore from '@ohos.data.relationalStore';

export default class RDBUtils{
  private static instace: RDBUtils

  private context:Context

  private rdbStore: relationalStore.RdbStore

  private constructor(context:Context) {
      this.context =context
  }
  static getInstance(context:Context): RDBUtils {
    if (!RDBUtils.instace) {
      RDBUtils.instace = new RDBUtils(context)
    }
    return RDBUtils.instace
  }
  /**
   * 数据库初始化
   * */
  public initRDB() {
    const STORE_CONFIG: relationalStore.StoreConfig = {
      name: 'yuanzhen.db', // 数据库文件名
      securityLevel: relationalStore.SecurityLevel.S1, // 数据库安全级别
      encrypt: false, // 可选参数,指定数据库是否加密,默认不加密
    };

    relationalStore.getRdbStore(this.context, STORE_CONFIG, (err, store) => {
      if (err) {
        return;
      }
      this.rdbStore =store
    })
  }





}

5.2 创建数据库表

public createTab(){
  // 判断数据库版本,如果不匹配则需进行升降级操作
  // 假设当前数据库版本为3,表结构:EMPLOYEE (NAME, AGE, SALARY, CODES)
  const SQL_CREATE_TABLE = 'CREATE TABLE IF NOT EXISTS EMPLOYEE (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT NOT NULL, AGE INTEGER, SALARY REAL, CODES BLOB)'; // 建表Sql语句
  // 当数据库创建时,数据库默认版本为0
  if (this.rdbStore.version == 0) {
    this.rdbStore.executeSql(SQL_CREATE_TABLE); // 创建数据表
    // 设置数据库的版本,入参为大于0的整数
    this.rdbStore.version = 1;
  }
}

5.3 数据库升降级

/**
 * 升降级
 * @param tagVersion目标版本号
 * */
public upgrade(tagVersion:number){
  if(tagVersion!=this.rdbStore.version){
    switch (tagVersion) {
      case 2:
        if (this.rdbStore != undefined) {
          (this.rdbStore as relationalStore.RdbStore).executeSql('ALTER TABLE EMPLOYEE ADD COLUMN AGE INTEGER');
          this.rdbStore.version = 2;
        }
        break
      case 3:
        if (this.rdbStore != undefined) {
          (this.rdbStore as relationalStore.RdbStore).executeSql('ALTER TABLE EMPLOYEE DROP COLUMN ADDRESS TEXT');
          this.rdbStore.version = 3;
        }
        break
    }
  }
}

5.4插入数据

/**
 * 插入数据
 * */
public instert(data:ValuesBucket,tabName:string){
    this.rdbStore.insert(tabName,data,(err)=>{
      if(err){
        console.log("insert error",err)
      }
    })
}

5.5 更新数据

/**
 * 更新数据
 * */
public update(data:ValuesBucket,predicates:relationalStore.RdbPredicates){
  this.rdbStore.update(data,predicates,(err)=>{
    if(err){
      console.log("update error",err)
    }
  })
}

5.6 删除数据

/*
 * 删除数据
 * */
public deleteData(predicates:relationalStore.RdbPredicates){
  this.rdbStore.delete(predicates,(err)=>{
    if(err){
      console.log("delete error",err)
    }
  })
}

5.7删除数据库

/**
 * 删除数据库
 * */
public destroy(){
  relationalStore.deleteRdbStore(this.context,"yuanzhen.db",(err)=>{
    if(err){
      console.log("delete error",err)
    }
  })
}

完整代码,只是简单的演示

import relationalStore from '@ohos.data.relationalStore';
import { ValuesBucket } from '@ohos.data.ValuesBucket';

export default class RDBUtils{
  private static instace: RDBUtils

  private context:Context

  private rdbStore: relationalStore.RdbStore

  private constructor(context:Context) {
      this.context =context
  }
  static getInstance(context:Context): RDBUtils {
    if (!RDBUtils.instace) {
      RDBUtils.instace = new RDBUtils(context)
    }
    return RDBUtils.instace
  }
  /**
   * 数据库初始化
   * */
  public initRDB() {
    const STORE_CONFIG: relationalStore.StoreConfig = {
      name: 'yuanzhen.db', // 数据库文件名
      securityLevel: relationalStore.SecurityLevel.S1, // 数据库安全级别
      encrypt: false, // 可选参数,指定数据库是否加密,默认不加密
    };

    relationalStore.getRdbStore(this.context, STORE_CONFIG, (err, store) => {
      if (err) {
        return;
      }
      this.rdbStore =store
    })
  }

  /**
   * 创建数据库表
   * */
  public createTab(){
    // 判断数据库版本,如果不匹配则需进行升降级操作
    // 假设当前数据库版本为3,表结构:EMPLOYEE (NAME, AGE, SALARY, CODES)
    const SQL_CREATE_TABLE = 'CREATE TABLE IF NOT EXISTS EMPLOYEE (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT NOT NULL, AGE INTEGER, SALARY REAL, CODES BLOB)'; // 建表Sql语句
    // 当数据库创建时,数据库默认版本为0
    if (this.rdbStore.version == 0) {
      this.rdbStore.executeSql(SQL_CREATE_TABLE); // 创建数据表
      // 设置数据库的版本,入参为大于0的整数
      this.rdbStore.version = 1;
    }
  }

  /**
   * 升降级
   * @param tagVersion目标版本号
   * */
  public upgrade(tagVersion:number){
    if(tagVersion!=this.rdbStore.version){
      switch (tagVersion) {
        case 2:
          if (this.rdbStore != undefined) {
            (this.rdbStore as relationalStore.RdbStore).executeSql('ALTER TABLE EMPLOYEE ADD COLUMN AGE INTEGER');
            this.rdbStore.version = 2;
          }
          break
        case 3:
          if (this.rdbStore != undefined) {
            (this.rdbStore as relationalStore.RdbStore).executeSql('ALTER TABLE EMPLOYEE DROP COLUMN ADDRESS TEXT');
            this.rdbStore.version = 3;
          }
          break
      }
    }
  }

  /**
   * 插入数据
   * */
  public instert(data:ValuesBucket,tabName:string){
      this.rdbStore.insert(tabName,data,(err)=>{
        if(err){
          console.log("insert error",err)
        }
      })
  }

  /**
   * 更新数据
   * */

  public update(data:ValuesBucket,predicates:relationalStore.RdbPredicates){
    this.rdbStore.update(data,predicates,(err)=>{
      if(err){
        console.log("update error",err)
      }
    })
  }
  /*
   * 删除数据
   * */
  public deleteData(predicates:relationalStore.RdbPredicates){
    this.rdbStore.delete(predicates,(err)=>{
      if(err){
        console.log("delete error",err)
      }
    })
  }

  /**
   * 删除数据库
   * */
  public destroy(){
    relationalStore.deleteRdbStore(this.context,"yuanzhen.db",(err)=>{
      if(err){
        console.log("delete error",err)
      }
    })
  }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1398109.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python seaborn库的边框设置(Seaborn篇-02)

Python seaborn库的边框设置(Seaborn篇-02)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔…

Swin版VMamba来了!精度再度提升,VMamba-S达成83.5%,超越Swin-S,已开源!

本文首发&#xff1a;AIWalker 就在昨日&#xff0c;华科王兴刚团队公开了Mamba在ViT的入局Vim&#xff0c;取得了更高精度、更快速度、更低显存占用。相关信息可参考&#xff1a; 入局CV&#xff0c;Mamba再显神威&#xff01;华科王兴刚团队首次将Mamba引入ViT&#xff0c;更…

钡铼 楼宇暖通网关之 BACnet网关在空气源热泵智能控制系统中的应用介绍

前言 在刚刚过去的2023年&#xff0c;空气源热泵市场依然火爆&#xff0c;全线市场销量递增&#xff0c;各种新品层出不穷&#xff0c;市场认可度持续攀升&#xff0c;在整个采暖市场&#xff0c;空气源热泵已然成为当红明星。 热泵组管道比较复杂&#xff0c;传感器分布比较分…

vue2 使用pdf.js 实现pdf预览,并可复制文本

需求&#xff1a;pdf预览&#xff0c;并且可以选中pdf的内容进行复制。 在ruoyi的vue前端项目中用到&#xff0c;参考了网上不少文章&#xff0c;因为大部分没给具体的pdf.js版本&#xff0c;导致运行过程中报各种api 错误&#xff0c;经过尝试以下版本可用&#xff0c…

Linux中的新建用户、切换用户

目录 一、Linux系统中有哪些用户 二、新建普通用户 三、root账号与普通账号的切换 一、Linux系统中有哪些用户 1.root 超级管理员&#xff08;不受权限约束&#xff09; 2.其他用户 普通用户&#xff08;受到权限约束&#xff09; 二、新建普通用户 创建新用户 sudo user…

HarmonyOS鸿蒙学习基础篇 - 项目目录和文件介绍

vue_basic├── hvigor //存储购置信息的文件&#xff0c;主要用于发布打包 ├── idea //开发工具相关配置可忽略 ├── AppScope //工程目录 全局公共资源存放路径 │ └── resources │ │ └── base │ │ │ └── element //常亮存放 │ │ …

2023年中国互联网测试开发大会(MTSC2023上海站):核心内容与学习收获(附大会核心PPT下载)

在当今快速发展的互联网时代&#xff0c;软件质量与用户体验的保障离不开测试开发工程师的辛勤付出。本次峰会正是在这样的背景下应运而生&#xff0c;旨在汇聚业界精英&#xff0c;共同探讨测试开发的最新技术与实践。本文将深入剖析大会的核心内容&#xff0c;以及参与者从中…

零日漏洞:威胁与应对

一、引言 随着信息技术的迅猛发展&#xff0c;网络安全问题日益凸显。其中&#xff0c;零日漏洞已成为当今网络安全领域最受关注的问题之一。本文将深入探讨零日漏洞的威胁、产生原因以及应对策略&#xff0c;以期提高人们对这一问题的认识和防范意识。 二、零日漏洞的威胁 …

elementUI+el-upload 上传、下载、删除文件以及文件展示列表自定义为表格展示

Upload 上传组件的使用 官方文档链接使用el-upload组件上传文件 具体参数说明&#xff0c;如何实现上传、下载、删除等功能获取文件列表进行file-list格式匹配代码 文件展示列表自定义为表格展示 使用的具体参数说明文件大小展示问题&#xff08;KB/MB&#xff09;文件下载代码…

Ubuntu中查看IP地址的常用命令及使用方法

在Ubuntu操作系统中&#xff0c;了解和查看IP地址是进行网络配置、故障排除以及连接其他设备的重要一步。 以下是几个常用的命令来查看IP地址&#xff1a; 一、ifconfig命令 输入ifconfig 输出如图所示&#xff0c;即为ip地址 如若提示没有ifconfig命令&#xff0c;则可以使用…

node.js(expree.js )模拟手机验证码功能及登录功能

dbconfig.js const mysql require(mysql) module.exports {// 数据库配置config: {host: localhost, // 连接地址port: 3306, //端口号user: root, //用户名password: wei630229, //密码database: exapp2, //数据库名}, // 连接数据库&#xff0c;使用mysql的连接池连接方式…

力扣36. 有效的数独

模拟 思路&#xff1a; 使用三个哈希表来存储数字个数 row[r][val] 用于存储第 r 行 val 1 的个数&#xff1b;column[c][val] 用于存储第 c 列 val 1 的个数&#xff1b; subboxes[i][j][val] 用于存储第 i 行、第 j 列个小九宫格 val 1 的个数&#xff0c;其中&#xff1…

原生微信小程AR序实现模型动画播放只播放一次,且停留在最后一秒

1.效果展示 0868d9b9f56517a9a07dfc180cddecb2 2.微信小程序AR是2023年初发布&#xff0c;还有很多问提&#xff08;比如glb模型不能直接播放最后一帧&#xff1b;AR识别不了金属、玻璃材质的模型等…有问题解决了的小伙伴记得告诉我一声&#xff09; 微信官方文档地址 3.代码…

HashMap 的底层实现#JDK1.8 之前

最近很多同学问我有没有java学习资料&#xff0c;我根据我从小白到架构师多年的学习经验整理出来了一份50W字面试解析文档、简历模板、学习路线图、java必看学习书籍 、 需要的小伙伴 可以关注我公众号&#xff1a;“ Tom聊架构 ”&#xff0c; 回复暗号&#xff1a;“ 578”即…

递归、搜索与回溯算法(专题一:递归)

往期文章&#xff08;希望小伙伴们在看这篇文章之前&#xff0c;看一下往期文章&#xff09; &#xff08;1&#xff09;递归、搜索与回溯算法&#xff08;专题零&#xff1a;解释回溯算法中涉及到的名词&#xff09;【回溯算法入门必看】-CSDN博客 接下来我会用几道题&#…

【开源】基于JAVA语言的教学资源共享平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课程资源模块2.4 课程作业模块2.5 课程评价模块 三、系统设计3.1 用例设计3.2 类图设计3.3 数据库设计3.3.1 课程档案表3.3.2 课程资源表3.3.3 课程作业表3.3.4 课程评价表 四、系统展…

WebSocket协议、与HTTP对比

WebSocket 也可前往本人的个人网站进行阅读 WebSocket 和 HTTP WebSocket和HTTP协议一样&#xff0c;都是基于TCP协议实现的应用层协议。 HTTP协议通常是单边通信&#xff0c;主要用于传输静态文档、请求-响应通信&#xff0c;适用于Web浏览器加载网页、API调用等。然而Web…

C++类与对象【运算符重载】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;C从基础到进阶 &#x1f384;1 运算符重载&#x1f33d;1.1 加号运算符重载&#x1f33d;1.2 左移运算符重载&#x1f33d;1.3 递增运算符重载&#x1f33d;1.4 赋值运算符重载&#x1f33…

『MySQL快速上手』-⑩-索引特性

文章目录 1.索引的作用2.索引的理解建立测试表插入多条记录查看结果 2.1 MySQL与磁盘交互的基本单位2.1 为何IO交互要是 Page2.3 理解单个Page2.4 理解多个Page2.5 页目录2.6 单页情况2.7 多页情况2.8 B vs B2.9 聚簇索引 vs 非聚簇索引非聚簇索引聚簇索引 3.索引操作3.1 创建主…

C#操作pdf之使用itext实现01-生成一个简单的table

创建.net 8控制台项目 安装itext <PackageReference Include"itext" Version"8.0.2" /><PackageReference Include"itext.bouncy-castle-adapter" Version"8.0.2" /><PackageReference Include"itext.bouncy-cast…