
基于关系型数据库的数据持久化
场景描述
关系型数据库(Relational Database,RDB)是一种基于关系模型来管理数据的数据库。关系型数据库基于SQLite组件提供了一套完整的对本地数据库进行管理的机制,对外提供了一系列的增、删、改、查等接口,也可以直接运行用户输入的SQL语句来满足复杂的场景需要。
场景一:基于RDB已提供API的数据库基础使用
场景二:基于executeSql、querySql执行增删改查复杂SQL语句
场景三:事务的使用
场景四:批量插入数据的不同实现方式及性能对比
场景五:数据库备份与恢复
场景六:全文检索(FTS)使用思路
方案描述
场景一:基于RDB已提供API的数据库基础使用
方案
通过insert、update、delete、query接口及关系型数据库谓词predicates的数据库基础操作。RdbPredicates:数据库中用来代表数据实体的性质、特征或者数据实体之间关系的词项,主要用来定义数据库的操作条件。常用的方法有equalTo,notEqualTo,or,and,isnull,between,orderby,groupby等。
核心代码
文中的操作主要基于如下的数据库,详细数据库使用步骤可参考:关系型数据库使用指南。
通过ValuesBucket构建数据,insert接口插入。
通过predicates构建删除条件,删除name为Lisa的数据,delete接口执行删除。
通过update接口,根据predicates构造的条件,及valueBucket传入的数据修改数据。
通过query接口查询数据,返回resultSet结果集,并解析查询到的数据。
向数据库添加数据。
场景二:基于executeSql、querySql执行增删改查复杂SQL语句
方案
在实际使用过程中,复杂的SQL语句可能无法直接通过场景一提供的方式实现,此时需要开发者通过executeSql、querySql接口执行自定义SQL语句。executeSql能够执行包含指定参数但不返回值的SQL语句,如创建表、创建索引、数据库触发器等场景。querySql能够根据指定SQL语句查询数据库中的数据,并返回查询结果ResultSet结果集。如递归查询、子查询等场景。
核心代码
对于上述的复杂SQL语句,就可以使用executeSql、querySql接口执行。
场景三:事务的使用
方案
数据库事务可以保证指一组数据库操作要么全部执行成功,要么全部回滚。鸿蒙关系型数据库提供了事务相关接口 beginTransaction、commit、rollBack。本例通过模拟一组操作中,有一条操作失败后,回滚已经执行的SQL语句。
核心代码
上述代码中第一条数据插入成功,第二条数据与表结构不符,插入时会失败,此时数据库会回滚,第一条插入的数据被撤销,数据库不会发生变化。
场景四:批量插入数据的不同实现方式及性能对比
方案
分别使用insert、事务insert、batchInsert三种方式各自插入5000条数据,统计各自任务耗时。
核心代码
直接使用insert插入5000条数据。
在事务中使用insert插入5000条数据。
使用barchInsert插入5000条数据。
对上述三个方法进行耗时统计,根据测试结果,事务中批量添加数据与直接for循环添加数据耗时相差无几,而使用batchInsert时,时间明显更快,且batchInsert接口内部使用了事务,因此建议批量插入场景使用batchInsert。
场景五:数据库备份与恢复
方案
在数据库的使用过程中,数据库可能会因为数据丢失、数据损坏、脏数据等而不可用情况,为了预防这种情况,可以通过backup接口,提前备份数据库数据到本地文件中,当发生意外后,可以通过restore接口,从指定的数据库备份文件恢复数据库。
核心代码
测试过程中,先通过myBackup备份数据库,数据库文件路径生成数据库备份文件dbBackup.db。
随后使用delete删除name为testA、testB数据后,此时数据库已无相关数据。
再使用myRestore恢复数据库后,数据库恢复到备份时状态。
注:数据库文件路径可通过context.databaseDir获取。如:/data/app/el2/100/database/{bundleName}/entry/rdb。
场景六:全文检索(FTS)使用思路
方案
HarmonyOS关系型数据库底层使用的是Sqlite,在Sqite中FTS的核心是倒排索引,它是一种将词汇映射到出现该词汇的文档集合的数据结构。在创建FTS虚拟表时,SQLite会为每个词汇生成一个倒排索引,记录该词汇在哪些文档(即数据库记录)中出现。倒排索引使得全文搜索能够快速找到包含特定词汇的文档,而无需遍历整个数据库。
FTS虚拟表(Full-Text Search Virtual Table)是SQLite中实现全文搜索的一种特殊表结构。它用于存储全文索引数据,包括倒排索引的信息。虽然FTS虚拟表在查询时表现得像普通的SQLite表,但其实现和存储方式与普通表有很大不同。
使用全文检索时,创建FTS表需要使用CREATE VIRTUAL TABLE语句,执行全文搜索需要使用MATCH关键字,当前HarmonyOS关系型数据库并没有直接提供相关接口,但是数据库底层是支持的,因此可以通过executeSql、querySql执行相关SQL语句。
核心代码
查询虚拟表中AGE"字段匹配关键词"18"的记录,虚拟表查询结果:
参考链接
