HarmonyOS学习路之开发篇—数据管理(关系型数据库)

news2024/12/25 12:36:36

关系型数据库概述

关系型数据库(Relational Database,RDB)是一种基于关系模型来管理数据的数据库。HarmonyOS关系型数据库基于SQLite组件提供了一套完整的对本地数据库进行管理的机制,对外提供了一系列的增、删、改、查等接口,也可以直接运行用户输入的SQL语句来满足复杂的场景需要。HarmonyOS提供的关系型数据库功能更加完善,查询效率更加高效。

基本概念

  • 关系型数据库

    基于关系模型来管理数据的数据库,以行和列的形式存储数据。

  • 谓词

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

  • 结果集

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

  • SQLite数据库

    一款轻型的数据库,是遵守ACID的关系型数据库管理系统。它是一个开源的项目。

运作机制

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

图1 关系型数据库运作机制

 

默认配置

  • 如果不指定数据库的日志模式,那么系统默认日志方式是WAL(Write Ahead Log)模式。
  • 如果不指定数据库的落盘模式,那么系统默认落盘方式是FULL模式。
  • HarmonyOS数据库使用的共享内存默认大小是2MB。

约束与限制

  • 数据库中连接池的最大数量是4个,用以管理用户的读写操作。
  • 为保证数据的准确性,数据库同一时间只能支持一个写操作。

关系型数据库开发

场景介绍

关系型数据库是在SQLite基础上实现的本地数据操作机制,提供给用户无需编写原生SQL语句就能进行数据增删改查的方法,同时也支持原生SQL语句操作。

接口说明

数据库的创建和删除

关系型数据库提供了数据库创建方式,以及对应的删除接口,涉及的API如下所示。

表1 数据库创建和删除API

类名

接口名

描述

DatabaseHelper

DatabaseHelper(Context context)

DatabaseHelper是数据库操作的辅助类,当数据库创建成功后,数据库文件将存储在由上下文指定的目录里。数据库文件存储的路径会因指定不同的上下文存在差异。

  • 获取上下文参考方法:ohos.app.Context#getApplicationContext()、ohos.app.AbilityContext#getContext()。
  • 查看详细路径信息:ohos.app.Context#getDatabaseDir()。

StoreConfig.Builder

public StoreConfig builder()

对数据库进行配置,包括设置数据库名、存储模式、日志模式、同步模式,是否为只读,及数据库加密。

RdbOpenCallback

public abstract void onCreate(RdbStore store)

数据库创建时被回调,开发者可以在该方法中初始化表结构,并添加一些应用使用到的初始化数据。

RdbOpenCallback

public abstract void onUpgrade(RdbStore store, int currentVersion, int targetVersion)

数据库升级时被回调。

RdbOpenCallback

public void onDowngrade(RdbStore store, int currentVersion, int targetVersion)

数据库降级时被回调。

DatabaseHelper

public RdbStore getRdbStore(StoreConfig config, int version, RdbOpenCallback openCallback, ResultSetHook resultSetHook)

根据配置创建或打开数据库。

DatabaseHelper

public boolean deleteRdbStore(String name)

删除指定的数据库。

数据库的加密

关系型数据库提供数据库加密的能力,在创建数据库时若指定了密钥,则会创建为加密数据库再次使用此数据库时,仍需要指定相同密钥,才能正确打开数据库。

表2 数据库传入密钥接口

类名

接口名

描述

StoreConfig.Builder

public StoreConfig.Builder setEncryptKey(byte[] encryptKey)

为数据库设置数据库加密密钥的配置类,创建或打开数据库时传入包含数据库加密密钥的配置类,即可创建或打开加密数据库。

数据库的增删改查

关系型数据库提供对本地数据增删改查操作的能力,相关API如下所示。

  • 新增关系型数据库提供了插入数据的接口,通过ValuesBucket输入要存储的数据,通过返回值判断是否插入成功,插入成功时返回最新插入数据所在的行号,失败时则返回-1。
    表3 数据库插入API

    类名

    接口名

    描述

    RdbStore

    long insert(String table, ValuesBucket initialValues)

    向数据库插入数据。

    • table:待添加数据的表名。
    • initialValues:以ValuesBucket存储的待插入的数据。它提供一系列put方法,如putString(String columnName, String values),putDouble(String columnName, double value),用于向ValuesBucket中添加数据。
  • 更新

    调用更新接口,传入要更新的数据,并通过AbsRdbPredicates指定更新条件。该接口的返回值表示更新操作影响的行数。如果更新失败,则返回0。

    表4 数据库更新API

    类名

    接口名

    描述

    RdbStore

    int update(ValuesBucket values, AbsRdbPredicates predicates)

    更新数据库表中符合谓词指定条件的数据。

    • values:以ValuesBucket存储的要更新的数据。
    • predicates:指定了更新操作的表名和条件。AbsRdbPredicates的实现类有两个:RdbPredicates和RawRdbPredicates。
      • RdbPredicates:支持调用谓词提供的equalTo等接口,设置更新条件。
      • RawRdbPredicates:仅支持设置表名、where条件子句、whereArgs三个参数,不支持equalTo等接口调用。
  • 删除

    调用删除接口,通过AbsRdbPredicates指定删除条件。该接口的返回值表示删除的数据行数,可根据此值判断是否删除成功。如果删除失败,则返回0。

    表5 数据库删除API

    类名

    接口名

    描述

    RdbStore

    int delete(AbsRdbPredicates predicates)

    删除数据。

    predicates:Rdb谓词,指定了删除操作的表名和条件。AbsRdbPredicates的实现类有两个:RdbPredicates和RawRdbPredicates。

    • RdbPredicates:支持调用谓词提供的equalTo等接口,设置更新条件。
    • RawRdbPredicates:仅支持设置表名、where条件子句、whereArgs三个参数,不支持equalTo等接口调用。
  • 查询

    关系型数据库提供了两种查询数据的方式:

    • 直接调用查询接口。使用该接口,会将包含查询条件的谓词自动拼接成完整的SQL语句进行查询操作,无需用户传入原生的SQL语句。
    • 执行原生的SQL语句进行查询操作。
    表6 数据库查询API

    类名

    接口名

    描述

    RdbStore

    ResultSet query(AbsRdbPredicates predicates, String[] columns)

    查询数据。

    • predicates:谓词,可以设置查询条件。AbsRdbPredicates的实现类有两个:RdbPredicates和RawRdbPredicates。
      • RdbPredicates:支持调用谓词提供的equalTo等接口,设置查询条件。
      • RawRdbPredicates:仅支持设置表名、where条件子句、whereArgs三个参数,不支持equalTo等接口调用。
    • columns:规定查询返回的列。

    RdbStore

    ResultSet querySql(String sql, String[] sqlArgs)

    执行原生的用于查询操作的SQL语句。

    sql:原生用于查询的sql语句。

    sqlArgs:sql语句中占位符参数的值,若select语句中没有使用占位符,该参数可以设置为null。

数据库谓词的使用

关系型数据库提供了用于设置数据库操作条件的谓词AbsRdbPredicates,其中包括两个实现子类RdbPredicates和RawRdbPredicates:

  • RdbPredicates:开发者无需编写复杂的SQL语句,仅通过调用该类中条件相关的方法,如equalTo、notEqualTo、groupBy、orderByAsc、beginsWith等,就可自动完成SQL语句拼接,方便用户聚焦业务操作。
  • RawRdbPredicates:可满足复杂SQL语句的场景,支持开发者自己设置where条件子句和whereArgs参数。不支持equalTo等条件接口的使用。
表7 数据库谓词API

类名

接口名

描述

RdbPredicates

RdbPredicates equalTo(String field, String value)

设置谓词条件,满足field字段与value值相等。

RdbPredicates

RdbPredicates notEqualTo(String field, String value)

设置谓词条件,满足field字段与value值不相等。

RdbPredicates

RdbPredicates beginsWith(String field, String value)

设置谓词条件,满足field字段以value值开头。

RdbPredicates

RdbPredicates between(String field, int low, int high)

设置谓词条件,满足field字段在最小值low和最大值high之间。

RdbPredicates

RdbPredicates orderByAsc(String field)

设置谓词条件,根据field字段升序排列。

RawRdbPredicates

void setWhereClause(String whereClause)

设置where条件子句。

RawRdbPredicates

void setWhereArgs(List<String> whereArgs)

设置whereArgs参数,该值表示where子句中占位符的值。

查询结果集的使用

关系型数据库提供了查询返回的结果集ResultSet,其指向查询结果中的一行数据,供用户对查询结果进行遍历和访问。ResultSet对外API如下所示。

表8 结果集API

类名

接口名

描述

ResultSet

boolean goTo(int offset)

从结果集当前位置移动指定偏移量。

ResultSet

boolean goToRow(int position)

将结果集移动到指定位置。

ResultSet

boolean goToNextRow()

将结果集向后移动一行。

ResultSet

boolean goToPreviousRow()

将结果集向前移动一行。

ResultSet

boolean isStarted()

判断结果集是否被移动过。

ResultSet

boolean isEnded()

判断结果集当前位置是否在最后一行之后。

ResultSet

boolean isAtFirstRow()

判断结果集当前位置是否在第一行。

ResultSet

boolean isAtLastRow()

判断结果集当前位置是否在最后一行。

ResultSet

int getRowCount()

获取当前结果集中的记录条数。

ResultSet

int getColumnCount()

获取结果集中的列数。

ResultSet

String getString(int columnIndex)

获取当前行指定列的值,以String类型返回。

ResultSet

byte[] getBlob(int columnIndex)

获取当前行指定列的值,以字节数组形式返回。

ResultSet

double getDouble(int columnIndex)

获取当前行指定列的值,以double型返回。

事务

关系型数据库提供事务机制,来保证用户操作的原子性。对单条数据进行数据库操作时,无需开启事务;插入大量数据时,开启事务可以保证数据的准确性。如果中途操作出现失败,会自动执行回滚操作。

表9 事务API

类名

接口名

描述

RdbStore

void beginTransaction()

开启事务。

RdbStore

void markAsCommit()

设置事务的标记为成功。

RdbStore

void endTransaction()

结束事务。当调用此方法前若执行markAsCommit方法,事务会提交,否则事务会自动回滚。

事务和结果集观察者

关系型数据库提供了事务和结果集观察者能力,当对应的事件被触发时,观察者会收到通知。

类名

接口名

描述

RdbStore

void beginTransactionWithObserver(TransactionObserver transactionObserver)

开启事务,并观察事务的启动、提交和回滚。

ResultSet

void registerObserver(DataObserver observer)

注册结果集的观察者。

ResultSet

void unregisterObserver(DataObserver observer)

注销结果集的观察者。

数据库的备份和恢复

用户可以将当前数据库的数据进行保存备份,还可以在需要的时候进行数据恢复。

表10 数据库备份和恢复

类名

接口名

描述

RdbStore

boolean restore(String srcName)

数据库恢复接口,从指定的非加密数据库文件中恢复数据。

RdbStore

boolean restore(String srcName, byte[] srcEncryptKey, byte[] destEncryptKey)

数据库恢复接口,从指定的数据库文件(加密和非加密均可)中恢复数据。

RdbStore

boolean backup(String destName)

数据库备份接口,备份出的数据库文件是非加密的。

RdbStore

boolean backup(String destName, byte[] destEncryptKey)

数据库备份接口,此方法经常用在备份出加密数据库场景。

开发步骤

创建数据库。

  1. 配置数据库相关信息,包括数据库的名称、存储模式、是否为只读模式等。
  2. 初始化数据库表结构和相关数据。
  3. 创建数据库。

示例代码如下:

// 可以通过ohos.app.Context#getApplicationContext()或ohos.app.AbilityContext#getContext()获取context。
DatabaseHelper helper = new DatabaseHelper(context); 
StoreConfig config = StoreConfig.newDefaultConfig("RdbStoreTest.db");
RdbOpenCallback callback = new RdbOpenCallback() {
    @Override
    public void onCreate(RdbStore store) {
        store.executeSql("CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER, salary REAL, blobType BLOB)");
    }
    @Override
    public void onUpgrade(RdbStore store, int oldVersion, int newVersion) {
    }
};

RdbStore store = helper.getRdbStore(config, 1, callback, null);

插入数据。

  1. 构造要插入的数据,以ValuesBucket形式存储。
  2. 调用关系型数据库提供的插入接口。

示例代码如下:

ValuesBucket values = new ValuesBucket();
values.putInteger("id", 1);
values.putString("name", "zhangsan");
values.putInteger("age", 18);
values.putDouble("salary", 100.5);
values.putByteArray("blobType", new byte[] {1, 2, 3});
long id = store.insert("test", values);

查询数据。

  1. 构造用于查询的谓词对象,设置查询条件。
  2. 指定查询返回的数据列。
  3. 调用查询接口查询数据。
  4. 调用结果集接口,遍历返回结果。

示例代码如下:

String[] columns = new String[] {"id", "name", "age", "salary"};
RdbPredicates rdbPredicates = new RdbPredicates("test").equalTo("age", 25).orderByAsc("salary"); 
ResultSet resultSet = store.query(rdbPredicates, columns);
resultSet.goToNextRow();

注册结果集观察者。

  1. 注册观察者,类型为DataObserverAsyncWrapper。
  2. 设置受影响的URI

示例代码如下:

resultSet.registerObserver(dataObserverAsyncWrapper);
List<Uri> uris = new ArrayList<>();
uris.add(Uri.parse(String.format((Const.BASE_URI + Const.DATA_PATH), "")));
resultSet.setAffectedByUris(this, uris);

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

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

相关文章

深度学习-GPU多卡并行训练总结

1.为什么要使用多GPU并行训练 简单来说&#xff0c;有两种原因&#xff1a;第一种是模型在一块GPU上放不下&#xff0c;两块或多块GPU上就能运行完整的模型&#xff08;如早期的AlexNet&#xff09;。第二种是多块GPU并行计算可以达到加速训练的效果。想要成为“炼丹大师“&…

【原生HTML+SpringBoot】电子病历编辑器源码

一、简介 本系统主要面向医院医生、护士&#xff0c;提供对住院病人的电子病历书写、保存、修改、打印等功能。本系统基于云端SaaS服务方式&#xff0c;通过浏览器方式访问和使用系统功能&#xff0c;提供电子病历在线制作、管理和使用的一体化电子病历解决方案&#x…

常见面试题之JVM组成

1. JVM由那些部分组成&#xff0c;运行流程是什么&#xff1f; JVM是什么 Java Virtual Machine Java程序的运行环境&#xff08;java二进制字节码的运行环境&#xff09; 好处&#xff1a; 一次编写&#xff0c;到处运行 自动内存管理&#xff0c;垃圾回收机制 JVM由哪些…

sqldeveloper 连接 MySQL

sqldeveloper 连接 MySQL 工作中使用 Oracle 用户的小伙伴&#xff0c;sqldeveloper 是常用的开发和运维工具之一 工作中如果连接MySQL需要安装额外的客户端工具 不但学习成本高而且维护也较为麻烦 能不能使用 sqldeveloper 可以同时管理Oracle和MySQL两种甚至更多种数据库 成为…

基于Javaweb实现ATM机系统开发实战(一)基础配置和搭建

一、环境介绍 JDK:JDK1.8 IDEA:2020 MYSQL :MYSQL5.7 Navcat :mysql的客户端工具 Tomcat:tomcat5.7 二、项目简介 本项目主要实现一个模拟ATM机存款、取款、转账功能的一个系统&#xff0c;可以查看打印交易明细&#xff0c;后台用户可以管理用户账户卡信息。本系统主要是针对计…

Java易忘知识点

Java八大基本类型 整数类型&#xff1a;byte&#xff0c;1字节&#xff0c;8位&#xff0c;最大存储数据量是255&#xff0c;存放的数据范围是-128~127之间。整数类型&#xff1a;short&#xff0c;2字节&#xff0c;16位&#xff0c;最大数据存储量是65536&#xff0c;数据范…

centos下./configure报错:Permission denied

./configure 文章目录 ./configure报错解决方案使用chmod给./configure赋予x权限sftp给configure文件赋予x权限 ./configure报错 -bash: ./configure: Permission denied解决方案 使用chmod给./configure赋予x权限 sudo chmod x ./configuresftp给configure文件赋予x权限

推荐一个基于Java 的在线网盘开源程序

目录 一、软件简介 二、功能列表 文件列表 画廊模式 视频预览 文本预览 音频预览 PDF 预览 Office 预览 3d 文件预览 生成直链 页面设置 后台设置-登录 后台设置-存储源列表 后台设置-存储源权限控制 后台设置-添加存储源(本地存储) 后台设置-添加存储源 后…

Spring Boot中的请求参数绑定及使用

Spring Boot中的请求参数绑定及使用 在Web应用程序中&#xff0c;请求参数绑定是非常重要的操作。Spring Boot框架使得请求参数绑定变得非常简单&#xff0c;通过使用注解和预定义的类可以轻松地实现此操作。本文将介绍Spring Boot中的请求参数绑定及其使用。 请求参数绑定 在…

第十章:C语言数据结构与算法初阶之链式二叉树

系列文章目录 文章目录 系列文章目录前言一、链式二叉树的定义二、链式二叉树的实现三、链式二叉树的遍历1、前序遍历/先根遍历2、中序遍历/中根遍历3、后序遍历/后根遍历4、层序遍历5、前/中/后序遍历的关系 四、节点个数以及高度等1. 二叉树节点的个数2. 二叉树叶子节点个数3…

Java面试知识点复习​_kaic

一、后端基础 1.Java基础、集合、线程、异常&#xff08;自定义异常&#xff09;流 2.mysql、redis、mongodb(为什么使用) 3.ssm、springboot、springcloud、mybatis-plus 1.接口和抽象类的区别 二、前端基础 1.事件 三、实习和项目 1.博客项目的日志配置&#xff08;切面&a…

flutter tabBar 的属性及自定义实现

flutter tabBar 的属性及自定义实现 前言一、TabBar是什么&#xff1f;二、TabBar 自定义三、 Tab 自定义总结 前言 在Flutter中&#xff0c;TabBar的indicatorPadding属性用于设置指示器的内边距&#xff0c;而不是用于调整指示器和文字之间的间距。要调整TabBar中指示器和文字…

Field ‘非主键_id‘ doesn‘t have a default value

参考文章 Field ‘非主键_id‘ doesn‘t have a default value 的sql报错有两种情况 1.如果id是主键的话,一般是主键没有添加自增导致的错误 2.如果报错的是非主键id 那么是数据库设置错误 前端请求参数根本没有传入business_id 但是数据库报错 解决方法 把数据库数据限制n…

python 第九章 常用操作

系列文章目录 第一章 初识python 第二章 变量 第三章 基础语句 第四章 字符串str 第五章 列表list [] 第六章 元组tuple ( ) 第七章 字典dict {} 第八章 集合set {} 文章目录 系列文章目录9.1公共操作运算符 合并* 复制判断数据是否存在 公共方法len()delmax()min()rangeenume…

css实现文档目录(中间分割线宽度不定)

css实现文档目录&#xff08;中间分割线宽度不定&#xff09; 先上图片看效果 布局 数据 css样式 其实挺简单的&#xff0c;flex直接搞定

十六、centos7 下给python3创建虚拟环境

十五、centos7 下给python3创建虚拟环境 1.先说下为什么要创建虚拟环境 python3安装完成后&#xff0c;安装第三方库 pip3 install requests -i https://pypi.doubanio.com/simple提示如下让使用虚拟环境&#xff0c;不使用&#xff0c;即便是安装&#xff0c;也不能使用已经…

长连接和短链接详解

长连接和短链接详解 日常工作和生活中接触到的软件系统大多数情况下是由多个进程共同协作进行的&#xff0c;所以&#xff0c;了解进程之间如何进行高效的通信至关重要。 进程之间的通信有不少方式包括管道&#xff08;包括无名管道和命名管道&#xff09;、消息队列、信号量、…

Vue3在外部js文件获取Vue实例对象中的方法

刚开始想用getCurrentInstance 获取 发现这玩意只能写在setUp里面 然后百度发现在外部js文件只能先引入main.js在使用&#xff0c;这里注意要先将app实例导出 然后在外部js引用 就能获取到实例对象了 这点跟Vue2还是有很大区别

【SLAM14讲】 SLAM数学基础

一、向量 我们确定一个坐标系&#xff0c;也就是一个线性空间的基 (e1, e2, e3)&#xff0c; 那就可以谈论向量 a 在这组基下的坐标了&#xff1a; 1.1 内积 内积可以描述向量间的投影关系 1.2 外积 外积的方向垂直于这两个向量&#xff0c;大小为 |a| |b|sin 〈a, b〉&…

【生态系统服务】构建生态安全格局--权衡与协同动态分析--多情景模拟预测--社会价值评估

生态系统服务 生态系统服务&#xff08;ecosystem services&#xff09;是指人类从生态系统获得的所有惠益&#xff0c;包括供给服务&#xff08;如提供食物和水&#xff09;、调节服务&#xff08;如控制洪水和疾病&#xff09;、文化服务&#xff08;如精神、娱乐和文化收益…