相较于用户首选项,关系型数据库拥有固定的数据结构,并能支持复杂的查询操作。此外,它还能满足事务处理,数据安全加密等高级需求。因此在面对数据结构固定,且数据量较大的场景时,例如,类似右表一样的结构,我们可以考虑采用关系型数据库作为数据存储方法
- 数据结构固定
- 需要支持复杂查询
- 支持事务操作
一、关系型数据库概述
- 关系型数据库简介
关系型数据库(Relational Database,RDB)是一种基于关系模型来管理数据的数据库。
关系型数据库基于SQLite组件
基于SQLite组件提供了一套完整的对本地数据库进行管理的机制
对外提供了一系列的增、删、改、查等接口
可以直接运行用户输入的SQL语句来满足复杂的场景需要。
那么为何我们要选择使用关系型数据库呢,关系型数据库具备以下显著的特点与优势。
关系型数据库特点:
- 数据完整性
关系型数据库通过定义数据的约束条件和关系之间的外键关系,可以确保数据的一致性和准确性,防止数据的损坏或不一致。 - 事务处理
关系型数据库支持事务处理,能够确保在并发环境下数据的一致性和完整性。事务的ACID属性(原子性、一致性、隔离性、持久性)为数据的安全性和稳定性提供了保障。 - 复杂查询能力
关系型数据库支持复杂的SQL查询,能够处理多表之间的关联查询和复杂的分析操作,满足复杂业务场景的需求。 - 数据安全性
关系型数据库提供强大的数据安全性功能,包括用户身份验证、权限控制和数据加密等,有助于保护敏感数据免受未经授权的访问和恶意攻击。
二、关系型数据库工作流程
关系型数据库对应用提供通用的操作接口,底层使用SQLite作为持久化存储引擎,支持SQLite具有的数据库特性,包括但不限于事务、索引、视图、触发、外键、参数化查询和预编译SQL语句。

在掌握了关系型数据库的机制原理后,我们来简要了解以下其系统能力。
关系型数据库的API主要包括三个核心实体对象(如图):
RdbPredicates
RdbStore
ResultSet

根据关系型数据库的工作流程图,我们可以总结出以下开发流程。
首先在项目中导入关系型数据库的相关模块,接着获取RdbStore的实例,这是进行数据库操作的基础,在获取到RdbStore实例后,我们可以配合RdbPredicates来定义数据库操作的具体条件,比如查询哪些数据、更新哪些记录等。随后根据定义好的操作条件和所需的数据库操作,通过RdbStore提供的接口执行相应的数据库操作。如果执行的是查询操作,那么操作完成后,我们可以通过ResultSet来获取查询结果集,并对结果进行进一步的处理或展示。

-
因此我们可以依据开发流程逐步进行,首要步骤是导入所需的模块

-
在成功导入模块后,下一步是提取RdbStore实例,RdbStore是一个提供管理关系型数据库方法接口的类。通过调用getRdbStore方法,我们可以获取到关系型数据库的实例。getRdbStore方法的第一个参数是应用上下文;第二个参数则是数据库的配置信息,数据库配置涵盖多种信息,例如数据库文件名、安全级别以及是否加密等,这些都是较为常用的配置,当然关系型数据库还支持其他多种配置参数,可以查阅关系型数据库的API参考文档,以获取更全面的信息。


-
在成功获取RdbStore实例后,进行数据库操作之前,我们可以利用RdbPredicates来设定筛选条件,RdbPredicates表示关系型数据库的谓词。。该类确定RDB中条件表达式的值是true还是false。谓词间支持多语句拼接,拼接时默认使用and()连接。

-
执行数据库操作时,我们主要依赖于RdbStore提供的数据库操作接口,以下面的代码为例,它执行了一个删除操作,结合RdbPredicates设置的筛选条件,成功筛选了EMPLOYEE表中NAME字段值为Lisa的记录,并返回了受影响的行数,随后打印出来,这样我们完成了一个基于筛选条件的删除数据库操作。

-
最后当执行查询操作时,我们可以使用ResultSet来获取查询结果。ResultSet提供通过查询数据库生成的数据库结果集的访问方法。结果集是指用户调用关系型数据库查询接口之后返回的结果集合。提供了多种灵活的数据访问方式,以便用户获取各项数据。以下是一个完成的查询操作示例代码

-
首先我们生命了一个名为resultSet的变量,它的作用是存储执行查询操作后返回的结果集,接着我们使用RdbPredicates设置了筛选条件,即选择EMPLOYEE表中 AGE字段值为18的记录,随后我们执行query操作,并将之前设置的RdbPredicates作为参数传递进去,第二个参数指定了要查询的列,如果此处留空,则表示查询将应用于所有列,最后我们成功获取了ResultSet对象,并对其进行分析和处理,至此我们完成了一个完整的查询操作。
三、关系型数据库开发实践

**- 首先我们需要获取RdbStore实例,随后利用此实例来创建数据表,并进行必要的初始化操作。
第一步是获取RdbStore实例,我们通过调用getRdbStore方法来实现,并将所得到的实例保存在工具类的一个对象属性里,以便后续方法能够便捷地引用它。

- 获取RdbStore实例后,接下来的步骤是创建并初始化数据表,本次操作设计两张表,运动表和计划表,运动表的设计包含三个字段,ID作为主键,运动名以及运动类型。为了创建这些表,我们将使用execute方法执行SQL语句,该方法支持执行增删改操作,也支持PRAGMA语法的SQL,以及对表的各种操作,如建表、删表、修改表。需要注意的是,execute方法不支持执行查询操作,附加数据表和事务操作,如果需要这些功能,可以使用querySql、query、attach、beginTransaction和commit等接口。现在我们将使用execute方法,来编写和执行创建运动表和计划表的SQL语句,并完成必要的初始化工作。首先是运动表的创建,同样的我们也可以使用execute方法创建计划表,其字段有主键ID、指向运动表ID的外键sport_id,运动时长duration和完成状态status.

- 接下来我们使用batchInsert方法,向运动表中批量添加一些数据,这里我们省略了一些数据,该方法的参数包括表名以及需要插入的数据,其中数据需要封装成ValuesBucket类型

- 要实现重置按钮的功能,我们需要查询所有的计划记录,这可以通过调用querySql方法,并传递一个查询所有计划的SQL语句作为参数来完成,由于ResultSet可能包含多行数据,因此我们可以利用goToNextRow方法进行循环遍历,以逐行获取所有数据,在遍历每一行数据时,我们可以使用getValue方法来获取某个字段的具体值,此时需要将传递的参数设置为字段名,并且需要将获取到的值,强制转换为相应的数据类型。

- 筛选按钮的查询功能与查询所有记录类似,都是通过执行SQL语句来获取数据,但不同的是,筛选查询会根据特定的条件来执行不同的SQL语句,从而获取满足条件的记录。

- 编辑按钮的功能是通过update方法来实现的,我们需要先使用RdbPredicates来筛选出具有特定ID的记录,然后将新的目标值以及这个筛选条件作为参数传递给update的方法,以便更新这些记录。

- 删除操作可以通过delete方法来实现,只需将筛选条件RdbPredicates传入该方法,即可完成对应记录的删除。

- 新增按钮的功能是通过Insert方法来实现的,需要传递的参数包括表名和要插入的新增值,至此我们就已经理解了开发实践中的核心功能实现。**
