当前位置: 首页 > 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.lryc.cn/news/600570.html

相关文章:

  • SWC 深入全面讲解
  • Spring Boot SSE实战:SseEmitter实现多客户端事件广播与心跳保活
  • STM32概况
  • AI记忆问题解决方案Basic Memory
  • 实验-OSPF多区域
  • starrocks官网docker部署mysql无法连接
  • 微软中国高级架构师步绍鹏受邀为第十四届PMO大会演讲嘉宾
  • CSP2025模拟赛2(2025.7.26)
  • 使用 Google Earth 的 DEM — 教程。
  • pytest中的rerunfailures的插件(失败重试)
  • 深度学习(鱼书)day03--神经网络(后两节)
  • Spring Boot 3 如何整合 MinIO 实现分布式文件存储?
  • 速通python加密之SHA加密
  • VTK交互——ImageRegion
  • VTK交互——Callback
  • 香港本地和国际金融科技应用
  • (一)使用 LangChain 从零开始构建 RAG 系统|RAG From Scratch
  • Thinkph6中常用的验证方式实例
  • Nestjs框架: 基于Mongodb的多租户功能集成和优化
  • 【算法】前缀和经典例题
  • Go 语言函数设计原则:避免修改传入参数
  • Triton源代码分析 - 目录
  • VTK交互——CallData
  • Linux系统调用概述与实现:深入浅出的解析
  • Paimon Consumer机制解析
  • uniapp 自定义tab栏切换
  • 学习嵌入式的第三十三天-数据结构-(2025.7.25)服务器/多客户端模型
  • 服务器生成图片
  • 四大主流AI Agent框架选型梳理
  • Linux726 raid0,raid1,raid5;raid 创建、保存、停止、删除