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

本文涉及的产品
数据管理 DMS,安全协同 3个实例 3个月
推荐场景:
学生管理系统数据库
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB PostgreSQL 版,企业版 4核16GB
推荐场景:
HTAP混合负载
简介: 关系型数据库(Relational Database,RDB)是一种基于关系模型来管理数据的数据库。HarmonyOS关系型数据库基于SQLite组件提供了一套完整的对本地数据库进行管理的机制,对外提供了一系列的增、删、改、查等接口,也可以直接运行用户输入的SQL语句来满足复杂的场景需要。HarmonyOS提供的关系型数据库功能更加完善,查询效率更加高效。

关系型数据库概述

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


基本概念

关系型数据库

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


谓词

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


结果集

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


SQLite数据库

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


运作机制

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


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

4f388c5fc48520582f8c60437f17c47b.png

默认配置

如果不指定数据库的日志模式,那么系统默认日志方式是WAL(Write Ahead Log)模式。

如果不指定数据库的落盘模式,那么系统默认落盘方式是FULL模式。

HarmonyOS数据库使用的共享内存默认大小是2MB。

约束与限制

数据库中连接池的最大数量是4个,用以管理用户的读写操作。

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

关系型数据库开发

场景介绍

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


接口说明

数据库的创建和删除


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


表1 数据库创建和删除API


image.png

image.png

数据库的加密

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

表2 数据库传入密钥接口

image.png

数据库的增删改查


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


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

表3 数据库插入API

image.png

更新

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

表4 数据库更新API

image.png

删除

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

表5 数据库删除API

image.png

查询

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

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

表6 数据库查询API

image.png

数据库谓词的使用


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


RdbPredicates:开发者无需编写复杂的SQL语句,仅通过调用该类中条件相关的方法,如equalTo、notEqualTo、groupBy、orderByAsc、beginsWith等,就可自动完成SQL语句拼接,方便用户聚焦业务操作。

RawRdbPredicates:可满足复杂SQL语句的场景,支持开发者自己设置where条件子句和whereArgs参数。不支持equalTo等条件接口的使用。

表7 数据库谓词API


image.png

查询结果集的使用

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

表8 结果集API

image.png

事务

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

表9 事务API

image.png

事务和结果集观察者

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

image.png

数据库的备份和恢复

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

表10 数据库备份和恢复


开发步骤

创建数据库。

  1. 1.配置数据库相关信息,包括数据库的名称、存储模式、是否为只读模式等。
  2. 2.初始化数据库表结构和相关数据。
  3. 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);

插入数据。


构造要插入的数据,以ValuesBucket形式存储。

调用关系型数据库提供的插入接口。

示例代码如下:


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);

查询数据。


构造用于查询的谓词对象,设置查询条件。

指定查询返回的数据列。

调用查询接口查询数据。

调用结果集接口,遍历返回结果。

示例代码如下:

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();

注册结果集观察者。


注册观察者,类型为DataObserverAsyncWrapper。

设置受影响的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);


相关文章
|
1天前
|
SQL 存储 Java
SQL数据库学习指南:从基础到高级
SQL数据库学习指南:从基础到高级
|
2天前
|
运维 安全 数据管理
数据管理DMS产品使用合集之是否可以为同一个实例下的不同数据库设置不同的审批规则
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
17 5
|
2天前
|
运维 数据管理 数据库
数据管理DMS产品使用合集之遇到报错:数据库账号没有权限执行,该如何排查
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
12 2
|
2天前
|
SQL 关系型数据库 数据管理
数据管理DMS产品使用合集之归档数据至其它MySQL数据库时,如何指定目的库
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
13 1
|
2天前
|
SQL 弹性计算 数据管理
数据管理DMS产品使用合集之sql server实例,已经创建了数据库,登录时提示实例已存在,该怎么处理
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
14 1
|
7天前
|
SQL XML 数据库
后端数据库开发高级之通过在xml文件中映射实现动态SQL
后端数据库开发高级之通过在xml文件中映射实现动态SQL
14 3
|
7天前
|
SQL XML Java
后端数据库开发JDBC编程Mybatis之用基于XML文件的方式映射SQL语句实操
后端数据库开发JDBC编程Mybatis之用基于XML文件的方式映射SQL语句实操
25 3
|
7天前
|
Java 数据库连接 API
后端开发之用Mybatis简化JDBC的开发快速入门2024及数据库连接池技术和lombok工具详解
后端开发之用Mybatis简化JDBC的开发快速入门2024及数据库连接池技术和lombok工具详解
14 3
|
7天前
|
关系型数据库 MySQL 数据库
MySQL数据库开发之多表查询数据准备及案例实操
MySQL数据库开发之多表查询数据准备及案例实操
17 1
|
2天前
|
SQL Oracle 关系型数据库
数据库基础教程的全面总结与学习路径
数据库基础教程的全面总结与学习路径