【最新鸿蒙应用开发】——关系型数据库简单上手(RDB)

关系型数据库(RDB)

关系型数据库(Relational Database,RDB)是一种基于关系模型来管理数据的数据库。关系型数据库基于SQLite组件提供了一套完整的对本地数据库进行管理的机制,对外提供了一系列的增、删、改、查等接口,也可以直接运行用户输入的SQL语句来满足复杂的场景需要。不支持Worker线程。 ArkTS侧支持的基本数据类型:number、string、二进制类型数据、boolean。为保证插入并读取数据成功,建议一条数据不要超过2M。超出该大小,插入成功,读取失败。

该模块提供以下关系型数据库相关的常用功能:

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

  • RdbStore:提供管理关系数据库(RDB)方法的接口。

  • ResultSet:提供用户调用关系型数据库查询接口之后返回的结果集合。

说明:

1、导入模块

包不要导错了,API9的版本:

 import relationalStore from '@ohos.data.relationalStore'; //旧版API,不建议使用
  • 建议使用最新的API11:

import { relationalStore, ValuesBucket } from '@kit.ArkData'
2、创建数据库文件
 Button('创建数据库文件').onClick(async () => {// 获取操作数据库的管理对象(如果数据库文件不存在,会自动创建数据库文件)const store = await relationalStore.getRdbStore(getContext(), {name: 'RDB.db', // 数据库文件名securityLevel: relationalStore.SecurityLevel.S1, // 数据库安全级别})// 执行创建表的语句 execute 执行store.executeSql(this.sqlCreate)AlertDialog.show({ message: '创建成功' })})

注意:需要获取数据库管理对象,才能进行增删改查操作

  // 获取数据库管理对象async getStoreInstance() {// 如果已经存在,直接返回if (this.store) {return this.store}// 获取操作数据库的管理对象(如果数据库文件不存在,会自动创建数据库文件)this.store = await relationalStore.getRdbStore(getContext(), {name: 'RDB.db', // 数据库文件名securityLevel: relationalStore.SecurityLevel.S1, // 数据库安全级别})// 执行创建表的语句 execute 执行this.store.executeSql(this.sqlCreate)// 返回 store 对象return this.store}
3、查询数据库表的字段
 Button('查询数据库表的字段').onClick(async () => {// 获取操作数据库的对象const store = await this.getStoreInstance()// 谓词(条件),谓词类需要 new 实例化,传入表名 privacy_noteconst predicates = new relationalStore.RdbPredicates(this.tableName)// query 查询,传入必传参数 谓词const resultSet = await store.query(predicates)AlertDialog.show({ message: '数据库的字段名:' + resultSet.columnNames })})
4、新插入一条数据
 Button('新建一条数据').onClick(async () => {// 获取操作数据库的对象const store = await this.getStoreInstance()// 添加一条数据const id = await store.insert(this.tableName, {id: null, // 新增时设置 id 为空值 null,用于自增 idtitle: '关键的问题',content: '111',date_added: Date.now()} as NoteItem)AlertDialog.show({ message: '新增数组成功,数据的id为:' + id })// 批量添加,传入数组// store.batchInsert(表名, 数组)})
5、修改数据
Button('更新(修改)数据').onClick(async () => {// 获取操作数据库对象const store = await this.getStoreInstance()// 谓词(条件)const predicates = new relationalStore.RdbPredicates(this.tableName)// 注意!!!:记得添加 predicates 限定条件,否者修改全部predicates.equalTo('id', 10)// 待更新数据const value = {title: '新的标题',content: '新的内容'} as NoteItemconst affectedRows = await store.update(value, predicates)AlertDialog.show({ message: '更新(修改)数据 - 受影响行数:' + affectedRows })})
5、删除数据库文件(不推荐使用delete,建议设置为空值即可)
 Button('删除数据库文件').enabled(false).onClick(async () => {try {await relationalStore.deleteRdbStore(getContext(), 'heima.db')AlertDialog.show({ message: '删除成功' })} catch (error) {AlertDialog.show({ message: JSON.stringify(error, null, 2) })}})
6、最后,献上完整代码
import { relationalStore, ValuesBucket } from '@kit.ArkData'
​
// ValuesBucket 数据库支持的类型
interface NoteItem extends ValuesBucket {id: number | null // 新增时设置 id 为空值 null,用于自增 idtitle: stringcontent: stringdate_added: number
}
​
@Entry
@Component
struct RdbStoreTestPage {// 表名tableName: string = 'privacy_note'// SQL 语法:(SQL语法的数据类型关键词不一样,可通过AI生成SQL语句)// 解释说明://   CREATE TABLE IF NOT EXISTS     如果表不存在才创建新的表//   INTEGER -> number              INTEGER 整数型   FLOAT 浮点数//   PRIMARY KEY                    主键(唯一标识)//   AUTOINCREMENT                  自增//   TEXT -> string                 字符串型//   NOT NULL                       不允许空sqlCreate: string = `CREATE TABLE IF NOT EXISTS ${this.tableName} (id INTEGER PRIMARY KEY AUTOINCREMENT,title TEXT NOT NULL,content TEXT NOT NULL,date_added INTEGER NOT NULL)`// 操作数据库的管理对象store: relationalStore.RdbStore | null = null
​// 获取数据库管理对象async getStoreInstance() {// 如果已经存在,直接返回if (this.store) {return this.store}// 获取操作数据库的管理对象(如果数据库文件不存在,会自动创建数据库文件)this.store = await relationalStore.getRdbStore(getContext(), {name: 'rdb.db', // 数据库文件名securityLevel: relationalStore.SecurityLevel.S1, // 数据库安全级别})// 执行创建表的语句 execute 执行this.store.executeSql(this.sqlCreate)// 返回 store 对象return this.store}
​build() {Navigation() {Scroll() {Column({ space: 10 }) {Button('创建数据库文件').onClick(async () => {// 获取操作数据库的管理对象(如果数据库文件不存在,会自动创建数据库文件)const store = await relationalStore.getRdbStore(getContext(), {name: 'heima.db', // 数据库文件名securityLevel: relationalStore.SecurityLevel.S1, // 数据库安全级别})// 执行创建表的语句 execute 执行store.executeSql(this.sqlCreate)AlertDialog.show({ message: '创建成功' })})Button('查询数据库表的字段').onClick(async () => {// 获取操作数据库的对象const store = await this.getStoreInstance()// 谓词(条件),谓词类需要 new 实例化,传入表名 privacy_noteconst predicates = new relationalStore.RdbPredicates(this.tableName)// query 查询,传入必传参数 谓词const resultSet = await store.query(predicates)AlertDialog.show({ message: '数据库的字段名:' + resultSet.columnNames })})Button('新建一条数据').onClick(async () => {// 获取操作数据库的对象const store = await this.getStoreInstance()// 添加一条数据const id = await store.insert(this.tableName, {id: null, // 新增时设置 id 为空值 null,用于自增 idtitle: '哈哈哈呵呵呵',content: '111',date_added: Date.now()} as NoteItem)AlertDialog.show({ message: '新增数组成功,数据的id为:' + id })// 批量添加,传入数组// store.batchInsert(表名, 数组)})Button('查询所有数据').onClick(async () => {// 获取操作数据库的对象const store = await this.getStoreInstance()// 谓词(条件)const predicates = new relationalStore.RdbPredicates(this.tableName)predicates.orderByDesc('id') // 倒序(由大到小,常用于排序)// predicates.orderByAsc('id')   // 正序(小到大,常用于排序)// predicates.equalTo('id', 1)    // 等于(常用于详情页)// predicates.in('id', [1, 3, 5]) // 查找多项(常用批量删除)// predicates.like('title', '%哈%') //  模糊匹配(常用于搜索)// 还有很多...// predicates.greaterThan('id', 3)// resultSet 结果集const resultSet = await store.query(predicates)// 准备一个数组,用于存储数据库提取的数据const list: NoteItem [] = []// resultSet.goToNextRow()   指针移动到下一行while (resultSet.goToNextRow()) {// 移动指针的时候提取数据,按列下标提取数据list.push({// resultSet.getColumnIndex()        根据列名称获取下标(索引)id: resultSet.getLong(resultSet.getColumnIndex('id')),title: resultSet.getString(resultSet.getColumnIndex('title')),content: resultSet.getString(resultSet.getColumnIndex('content')),date_added: resultSet.getLong(resultSet.getColumnIndex('date_added')),})}// 循环结束后,获取所有数据AlertDialog.show({ message: JSON.stringify(list, null, 2) })})
​Button('查询数据总条数').onClick(async () => {// 获取操作数据库对象const store = await this.getStoreInstance()// 谓词(条件)const predicates = new relationalStore.RdbPredicates(this.tableName)// 结果集const resultSet = await store.query(predicates)AlertDialog.show({ message: '数据总条(行)数 rowCount:' + resultSet.rowCount })})
​Button('删除数据').onClick(async () => {// 获取操作数据库对象const store = await this.getStoreInstance()const predicates = new relationalStore.RdbPredicates(this.tableName)// 注意!!!:记得添加 predicates 限定条件,否者会删除所有数据// predicates.equalTo('id', 2)        // equalTo 删除一条predicates.in('id', [1, 2, 3, 4, 5]) //  in      批量删除const affectedRows = await store.delete(predicates)AlertDialog.show({ message: '受影响行数:' + affectedRows })})
​Button('更新(修改)数据').onClick(async () => {// 获取操作数据库对象const store = await this.getStoreInstance()// 谓词(条件)const predicates = new relationalStore.RdbPredicates(this.tableName)// 注意!!!:记得添加 predicates 限定条件,否者修改全部predicates.equalTo('id', 10)// 待更新数据const value = {title: '新的标题',content: '新的内容'} as NoteItemconst affectedRows = await store.update(value, predicates)AlertDialog.show({ message: '更新(修改)数据 - 受影响行数:' + affectedRows })})// Button('删除数据库文件')//   .enabled(false)//   .onClick(async () => {//     try {//       await relationalStore.deleteRdbStore(getContext(), 'heima.db')//       AlertDialog.show({ message: '删除成功' })//     } catch (error) {//       AlertDialog.show({ message: JSON.stringify(error, null, 2) })//     }//   })}.constraintSize({ minHeight: '100%' })}.width('100%').height('100%')}.title('关系型数据库').titleMode(NavigationTitleMode.Mini)}
}

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

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

相关文章

【cocos sreator】判定多边形和多边形相交

核心代码: cc.Intersection.polygonPolygon(points2, points) 拖拽物品拖到多个目标位置判定,取最近的: getTargetItem(collider2: cc.PolygonCollider, touchPos: cc.Vec2, targetRoot: cc.Node) {let length 99999;let target null;//col…

windows 下编译 TessRact+leptonica 识别图片文字

目录 1、下载 2. 编译基础依赖库 1.1 zlib 1.2 jpegsr9f 1.3 lpng1643 1.4 libgif 3. 编译tifflib 4. 配置nasm到系统环境中 5. 编译 libjpeg-turbo 6 编译leptonica 7. 编译tesseract 8. 测试验证 1、下载 下载tesseract5.3.2 下载leptonica1.83.1 下载l…

1638. 统计只差一个字符的子串数目

题目 给你两个字符串 s 和 t,请找出 s 中的非空子串的数目,这些子串满足替换一个不同字符以后,是 t 串的子串。换言之,请你找到 s 和 t 串中恰好只有一个字符不同的子字符串对的数目。 一个子字符串是一个字符串中连续的字符。 …

【全开源】旅游门票预订系统(FastAdmin+ThinkPHP+Uniapp)

一款基于FastAdminThinkPHPUniapp开发的旅游门票预订系统,支持景点门票、导游产品便捷预订、美食打卡、景点分享、旅游笔记分享等综合系统,提供前后台无加密源码,支持私有化部署。 ​便捷你的每一次出行🌍 🌟 轻松预订…

PMP中的各种图

单、双代号网络图 区别 内容 箭线图(ADM)-双 箭线活动 节点依赖关系 箭线图只能表示一种FS的关系 规划和控制项目活动进度的项目 (建筑、软件) 前导图(PDM)-单 节点代表活动 前导图法可以体现多种逻…

语义化版本控制:软件工程的实用之道

语义化版本控制:软件工程的实用之道 在软件开发过程中,版本控制是确保项目稳定、有序进行的关键环节。随着项目的发展,功能的增加、错误的修复以及API的修改变得日益频繁。为了有效管理这些变化,并确保团队成员、用户以及依赖该软…

Python中的上下文管理:深入探索contextlib模块

Python中的上下文管理:深入探索contextlib模块 在Python编程中,上下文管理器扮演着至关重要的角色,它们允许我们以一种非常优雅和高效的方式来管理资源,如文件操作、锁的获取与释放等。contextlib模块是Python标准库中的一个模块…

骨传导蓝牙耳机买哪款好?年度精选五款骨传导蓝牙耳机推荐

作为音乐爱好者的我,也一直在寻找一款好的骨传导耳机,听音乐对我来说不仅仅是一种消遣方式,更多是一种对生活、工作上压力和困难的舒缓,所以今天给大家推荐几款骨传导耳机。今天推荐这几款骨传导耳机都是比较有性价比,…

计算机网络学习实践:模拟RIP动态路由

计算机网络学习实践:模拟RIP动态路由 模拟动态路由RIP协议 1.实验准备 实验环境:华为模拟器ENSP 实验设备: 3个路由器,3个二层交换机(不是三层的),3个PC机 5个网段 192.168.1.0 255.255.…

【Linux】文件IO基础

man手册 通过man手册可以获取详细的Linux操作命令共有8章,查询使用man ls即可查询ls的相应命令,也可以使用相应的章节man 2 open查询第二章的open如何使用。 常用文件IO函数 功能函数描述实例打开文件int open(const char *pathname, int flags);打开…

21data 数据可视化 代码合集

<!-- <!DOCTYPE html> <html> <head><title>视觉映射和图例</title><meta charset"utf-8"><script src"echarts.js"></script> </head> <body> <div style"width: 600px;height:4…

电脑视频录制工具,推荐3款,让你的作品更专业!

随着信息技术的飞速发展&#xff0c;电脑视频录制工具在日常工作和娱乐中扮演着越来越重要的角色。它们不仅能帮助我们记录电脑屏幕上的精彩瞬间&#xff0c;还能为教学、演示、游戏直播等多种场景提供便利。本文将详细介绍三款电脑视频录制工具&#xff0c;并分步骤阐述它们的…

【TB作品】msp430f5529单片机,dht22,烟雾传感器

功能 //硬件&#xff1a;msp430f5529、dht22、LCD1602、蜂鸣器、烟雾传感器、蓝牙模块。 //功能&#xff1a;读取温湿度、烟雾浓度显示到屏幕&#xff1b; //按键调节三个报警数值&#xff1b; //温度、湿度、烟雾浓度&#xff0c;任意一个大于报警数值就蜂鸣器报警&#xff1…

如何编辑pdf文件内容?编辑技巧大揭秘,秒变办公达人!

如何编辑pdf文件内容&#xff1f;在数字化办公日益普及的今天&#xff0c;PDF文件因其跨平台、格式稳定的特点&#xff0c;成为我们日常工作和学习中不可或缺的一部分。然而&#xff0c;PDF文件的编辑却常常令人头疼&#xff0c;许多人面对需要修改内容的PDF文件时感到无从下手…

【RPG Maker MV 仿新仙剑 战斗场景UI (九)】

RPG Maker MV 仿新仙剑 战斗场景UI 九 前言角色战斗精灵精灵图设置攻击 战斗背景图 前言 前段天研究并完成了主角人物行走图部分的开发&#xff0c;完成了对应的8方向行走&#xff0c;及精灵的展示。现在开始重新回到战斗场景的开发中&#xff0c;回顾下&#xff0c;已完成功能…

如何手动批准内核扩展 Tuxera NTFS for mac内核扩展需要批准 内核扩展怎么打开

在了解如何手动批准内核扩展之前&#xff0c;我们应该先了解什么叫做内核扩展。内核扩展又被称为KEXT&#xff0c;通过它可以实现macOS系统与软件组件之间的交互&#xff0c;例如磁盘管理、任务管理和内存管理等等。 kext 是内核扩展&#xff08;Kernel Extension&#xff09;…

【漏洞复现】海康威视综合安防管理平台 orgManage/v1/orgs/download 任意文件读取漏洞复现

0x01 产品简介 海康威视综合安防管理平台是一套“集成化”、“智能化”的平台,通过接入视频监控、一卡通、停车场、报警检测等系统的设备。海康威视集成化综合管理软件平台,可以对接入的视频监控点集中管理,实现统一部署、统一配置、统一管理和统一调度。 0x02 漏洞概述 海康…

C语言:学生成绩管理系统(含源代码)

一.功能 二.源代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_NUM 100 typedef struct {char no[30];char name[10];char sex[10];char phone[20];float cyuyan;float computer;float datastruct; } *student, student1;typ…

渗透测试报告生成工具

目录 1.前言 1.1 渗透测试报告是什么? 1.2 渗透测试报告的编写需要考虑以下几点&#xff1a; 1.3 一份优秀的渗透测试报告应该具备以下特点&#xff1a; 1.4 在编写渗透测试报告之前&#xff0c;需要进行一些准备工作&#xff1a; 1.5 渗透测试报告一般包括以下部分&…

作为表达式调用时,无法解析类修饰器的签名。vue3+ts+vite,使用装饰器时报错

作为表达式调用时&#xff0c;无法解析类修饰器的签名。 The runtime will invoke the decorator with 2 arguments, but the decorator expects 1.ts(1238) 页面也无法打开 解决方案&#xff1a; {"extends": "vue/tsconfig/tsconfig.dom.json","in…