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

ArkData-关系型数据库

目录

  • 一、简介
  • 二、基本概念
  • 三、特点和优势
  • 四、系统能力
  • 五、应用
  • 五、关键操作说明

一、简介

关系数据库是一种基于关系模型来管理数据的数据库,鸿蒙基于SQLite组件提供了一套完整的本地数据库管理机制:

  • 提供增删改查等接口
  • 支持直接运行用户输入的SQL语句
  • 满足复杂场景需求

二、基本概念

概念说明
关系数据库以行和列形式存储数据,基于关系模型管理数据
谓词(RdbPredicates)定义数据库操作条件的词项,代表数据实体的性质、特征或关系
结果集(ResultSet)查询后的结果集合,提供灵活的数据访问方式
SQLite数据库轻量级开源关系数据库,遵守ACID特性(原子性、一致性、隔离性、持久性)

建议:单条数据不超过2MB

三、特点和优势

  1. 数据完整性

    • 通过约束条件和外键关系确保数据一致性
    • 防止数据损坏或不一致
  2. 事务处理

    • 支持ACID特性(原子性、一致性、隔离性、持久性)
    • 保障并发环境下的数据安全
  3. 复杂查询能力

    • 支持多表关联查询
    • 处理复杂分析操作
  4. 数据安全性

    • 用户身份验证
    • 权限控制
    • 数据加密

四、系统能力

接口功能
RdbPredicates定义数据库操作条件
RdbStore管理关系数据库的核心接口
ResultSet封装查询结果集合

在这里插入图片描述

五、应用

在这里插入图片描述

  1. 导入模块
import { relationalStore, ValuesBucket} from '@kit.ArkData';
  1. 创建数据库
  this.store = await relationalStore.getRdbStore(getContext(), {name: 'first.db',securityLevel: relationalStore.SecurityLevel.S1});
  1. 创建表
await this.store?.executeSql(this.sql)
  1. 查询表的信息
const predicates = new relationalStore.RdbPredicates(this.tableName) // 传入表名const resultSet = await this.store?.query(predicates)

在这里插入图片描述

  1. 新增数据
const id = await this.store?.insert('PrivacyNote', {id:  null,title: '测试标题',content: '测试标题',date_added: Date.now(),} as PrivacyNote)

在这里插入图片描述

  1. 查询数据 - query
const id = await this.store?.insert('PrivacyNote', {id:  null,title: '测试标题',content: '测试标题',date_added: Date.now(),
} as PrivacyNote)

在这里插入图片描述

  1. 删除数据 - delete
const predicates = new relationalStore.RdbPredicates(this.tableName)
//predicates.in('id', [2,5,6]) 可以删除多条信息
predicates.equalTo('id', 1)
await this.store?.delete(predicates)  
//要加上限定条件,不然就删库了

在这里插入图片描述
在这里插入图片描述

  1. 更新数据 - update
const predicates = new relationalStore.RdbPredicates(this.tableName)
predicates.equalTo('id', 4)
await this.store?.update({content: '修改了'
} as PrivacyNote, predicates)

在这里插入图片描述

  1. 删除数据库
await relationalStore.deleteRdbStore(getContext(), 'first.db')
  1. 完整代码示例
import { relationalStore, ValuesBucket} from '@kit.ArkData';
import { promptAction } from '@kit.ArkUI';// ValuesBucket 数据库值的类型
interface PrivacyNote extends ValuesBucket{id: number | nulltitle: stringcontent: stringdate_added: number
}@Entry
@Component
struct DatabaseTestPage {store: relationalStore.RdbStore | null = nulltableName: string = 'PrivacyNote'sql: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);`build() {Navigation() {Scroll() {Column({space: 10}) {Button('创建数据库').onClick(async () => {//创建this.store = await relationalStore.getRdbStore(getContext(),{name: 'heima2.db',securityLevel: relationalStore.SecurityLevel.S1})promptAction.showToast({message: '数据库文件创建成功'})})Button('创建表').onClick(async () => {await this.store?.executeSql(this.sql)promptAction.showToast({message: '建表成功'})})Button('查询表的信息').onClick(async  () => {// 查表,谓词传入表名// this.store 数据库(文件操作对象)// PrivacyNote 表名const predicates = new relationalStore.RdbPredicates(this.tableName) // 传入表名const resultSet = await this.store?.query(predicates)promptAction.showToast({message: '表字段名称' + resultSet?.columnNames})})Button('新增数据').onClick(async () => {// insert新增数据,返回值为新增数据的id// 注意事项:insert新增时,对象的key:value 都要符合建表时的字段和类型const id = await this.store?.insert('PrivacyNote', {id:  null,title: '测试标题',content: '测试标题',date_added: Date.now(),} as PrivacyNote)promptAction.showToast({message: '新增数据成功, id为:' + id})})Button('查询数据- query').onClick(async () => {// 查询总条总数// predicates 谓词(查询条件)const predicates = new relationalStore.RdbPredicates(this.tableName)// predicates.orderByAsc('字段名') //正序 从小到大// predicates.orderByDesc('字段名') //倒叙,从大到小// predicates.orderByDesc('id')// predicates.in('id', [1,2,3]) //提取一二三条// predicates.equalTo('id', 3) //查询单条信息// predicates.limitAs(3) //提取数量// predicates.offsetAs(3) //偏移// predicates.and()// 结果集const resultSet = await this.store?.query(predicates)const rowCount = resultSet?.rowCount as number < 0 ? 0: resultSet?.rowCountAlertDialog.show({message: '数据总条数' + rowCount})// 查询列表// resultSet?.goToNextRow() 移动指针到下一行,如果有数据则能返回trueconst list: PrivacyNote[] = []// goToNextRow 移动指针while (resultSet?.goToNextRow()) {//按列提取数据const item: PrivacyNote = {id: resultSet?.getLong(0), //列的下标title: resultSet.getString(1),content: resultSet.getString(2),date_added: resultSet.getLong(3)}//追加到数组中list.push(item)}AlertDialog.show({message: JSON.stringify(list, null, 2)})})Button('删除数据 - delete').onClick(async () => {const predicates = new relationalStore.RdbPredicates(this.tableName)//predicates.in('id', [2,5,6]) 可以删除多条信息predicates.equalTo('id', 3)await this.store?.delete(predicates)  //要加上限定条件,不然就删库了promptAction.showToast({message: '数据删除成功'})})Button('更新数据-update')//记得加上限定条件,否则就是修改全部.onClick(async () => {const predicates = new relationalStore.RdbPredicates(this.tableName)predicates.equalTo('id', 4)await this.store?.update({content: '傻傻呼呼'} as PrivacyNote, predicates)promptAction.showToast({message: '数据更新成功'})})Button('删除数据库').onClick(async () => {await relationalStore.deleteRdbStore(getContext(), 'heima2.db')promptAction.showToast({message: '删除成功'})})}.constraintSize({minHeight: '100%'})}.width('100%').height('100%')}.title('关系型数据库').titleMode(NavigationTitleMode.Mini)}
}

五、关键操作说明

  1. 条件查询(Predicates)
predicates.orderByAsc('字段名') //正序 从小到大
predicates.orderByDesc('字段名') //倒叙,从大到小
predicates.orderByDesc('id')
predicates.in('id', [1,2,3]) //提取一二三条
predicates.equalTo('id', 3) //查询单条信息
predicates.limitAs(3) //提取数量
predicates.offsetAs(3) //偏移
predicates.and()
  1. 结果集遍历
while (resultSet?.goToNextRow()) {//按列提取数据const item: PrivacyNote = {id: resultSet?.getLong(0), //列的下标title: resultSet.getString(1),content: resultSet.getString(2),date_added: resultSet.getLong(3)}
http://www.dtcms.com/a/300285.html

相关文章:

  • 测试分类
  • Swagger 配置及使用指南
  • Redis C++客户端——通用命令
  • 多模态大模型与 AI 落地:从技术原理到实践路径的深度解析
  • 力扣刷题(第九十九天)
  • 【C语言进阶】程序环境和预处理
  • [Python 基础课程]注释
  • C++高效实现AI人工智能实例
  • IntelliJ IDEA 中左上方未显示项目根目录问题
  • 网络:基础概念
  • GLSL 3.0简介
  • [RPA] 日期时间练习案例
  • Xinference vs SGLang:详细对比分析
  • 最优估计准则与方法(4)最小二乘估计(LS)_学习笔记
  • 【补题】Codeforces Global Round 15 B. Running for Gold
  • P1019 [NOIP 2000 提高组] 单词接龙
  • 从Python编程到AI大模型:GeoAI大模型驱动的地球科学智能计算——涵盖随机森林、CNN、LSTM、Transformer及科研绘图实战
  • linux mmc驱动精讲-1、引言
  • UNet改进(25):集成可变形注意力的高效图像分割方法
  • python 检测蜂窝网络,实现掉网自动拨号
  • nacos启动报错:Unable to start embedded Tomcat。
  • ChatIm项目文件上传与获取
  • 配置nodejs
  • 面试150 数据流的中位数
  • 6.数组和字符串
  • 从稀疏数据(CSV)创建非常大的 GeoTIFF(和 WMS)
  • 【时时三省】(C语言基础)返回指针值的函数
  • TRIM功能
  • 《代码随想录》刷题记录
  • 速通python加密之MD5加密