【鸿蒙开发】关系型数据库

143 阅读11分钟

前言

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

该模块提供以下常用功能

  • RdbPredicates:数据库中用来代表数据实体的性质、特征或者数据实体之间关系的词项,主要用来定义数据库的操作条件。
  • RdbStore:提供管理关系数据库(RDB)方法的接口。
  • ResultSet:提供用户调用关系型数据库查询接口之后返回的结果集合。
  • Transaction:提供管理事务对象的接口。

注意事项

  • 一条数据不超过2MB
  • 单次查询数据量不超过5000条。
  • 在TaskPool中查询
  • 拼接SQL语句尽量简洁
  • 合理地分批次查询。

文档

官网文档很详细,但是不利于我统一去查找方法,所以自己将方法总结一下

RdbPredicates

表示关系型数据库(RDB)的谓词。该类确定RDB中条件表达式的值是true还是false。谓词间支持多语句拼接,拼接时默认使用and()连接。不支持Sendable跨线程传递。

方法

方法描述
inDevices同步分布式数据库时连接到组网内指定的远程设备
inAllDevices同步分布式数据库时连接到组网内所有的远程设备。
equalTo设置条件等于
notEqualTo不等于
beginWrap括号开始
endWrap括号结束
or或者
and并且
contains包含
beginsWith以什么开头
endsWith以什么结尾
isNull为空
isNotNull不为空
like模糊匹配
glob通配符匹配
between给定范围区间,( q <= n <= p )
notBetween不包含给定范围
greaterThan大于
lessThan小于
greaterThanOrEqualTo大于或等于
lessThanOrEqualTo小于或等于
orderByAsc升序
orderByDesc降序
distinct过滤重复记录
limitAs设置最大数量
offsetAs查询返回的起始位置
groupBy分组查询
indexedBy指定索引列
in值在给定范围内
notIn值不在给定范围
notContains不包含什么
notLike不符合模糊匹配的数据
having筛选符合条件的分组数据(api20以上)

RdbStore

提供管理关系数据库(RDB)方法的接口。

在使用以下相关接口前,请使用executeSql接口初始化数据库表结构和相关数据。

属性

名称类型只读可选说明
version10+number设置和获取数据库版本,值为大于0的正整数。
rebuilt12+RebuildType用于获取数据库是否进行过重建或修复。

方法

方法说明
insert向目标表里插入一行数据
insertSync向目标表中插入一行数据(同步)
batchInsert向目标表中插入一组数据
batchInsertSync向目标表中插入一组数据,可以通过conflict参数指定冲突解决模式(Api18以上)
batchInsertSync向目标表中插入一组数据,可以通过conflict参数指定冲突解决模式(Api18以上、同步)
update根据RdbPredicates的指定实例对象更新数据库中的数据
updateSync根据RdbPredicates的指定实例对象更新数据库中的数据(同步)
delete根据RdbPredicates的指定实例对象从数据库中删除数据
deleteSync根据RdbPredicates的指定实例对象从数据库中删除数据(同步)
query根据指定条件查询数据库中的数据
querySync根据指定条件查询数据库中的数据(同步)
remoteQuery根据指定条件查询远程设备数据库中的数据
querySql根据指定SQL语句查询数据库中的数据,SQL语句中的各种表达式和操作符之间的关系操作符号不超过1000个
querySqlSync根据指定SQL语句查询数据库中的数据,SQL语句中的各种表达式和操作符之间的关系操作符号不超过1000个(同步)
executeSql执行包含指定参数但不返回值的SQL语句,语句中的各种表达式和操作符之间的关系操作符号不超过1000个
execute执行包含指定参数的SQL语句,语句中的各种表达式和操作符之间的关系操作符号不超过1000个,返回值类型为ValueType
executeSync执行包含指定参数的SQL语句,语句中的各种表达式和操作符之间的关系操作符号不超过1000个,返回值类型为ValueType。(同步)
getModifyTime获取数据库表中数据的最后修改时间
beginTransaction在开始执行SQL语句之前,开始事务
beginTrans在开始执行SQL语句之前,开始事务
createTransaction创建一个事务对象并开始事务(api14以上、优先使用)
commit提交已执行的SQL语句,跟beginTransaction配合使用。
rollBack回滚已经执行的SQL语句,跟beginTransaction配合使用。
rollback回滚已经执行的SQL语句,跟beginTrans配合使用。
backup以指定名称备份数据库
restore从指定的数据库备份文件恢复数据库
setDistributedTables设置分布式数据库表
obtainDistributedTableName根据远程设备的本地表名获取指定远程设备的分布式表名。在查询远程设备数据库时,需要使用分布式表名
sync在设备之间同步数据
cloudSync手动执行对所有分布式表的端云,使用该接口需要实现云服务功能。
on注册数据库的进程内或者进程间事件监听
off取消数据变更的事件监听
emit通知通过on注册的进程间或者进程内监听事件
cleanDirtyData清理云端删除的数据同步到本地后,未自动清理的,且数据的游标(cursor)小于指定游标的数据。
cleanDirtyData清理云端删除的数据同步到本地后,未自动清理的所有数据。
attach将一个数据库文件附加到当前数据库中,以便在SQL语句中可以直接访问附加数据库中的数据。
detach将附加数据库分离
lockRow根据RdbPredicates的指定实例对象从数据库中锁定数据,锁定数据不执行端云同步
unlockRow根据RdbPredicates的指定实例对象从数据库中解锁数据
queryLockedRow根据指定条件查询数据库中锁定的数据
close关闭数据库
rekey手动更新加密数据库的密钥

事件

事件名描述
dataChange数据库的数据变更的事件监听
autoSyncProgress云端自动同步进度通知,自动同步进行时调用回调
statisticssql执行时间的统计
sqliteErrorOccurred执行SQL语句时的异常日志(api20以上)
perfStat统计执行SQL的时间(事务结束)。

ResultSet

提供通过查询数据库生成的数据库结果集的访问方法。结果集是指用户调用关系型数据库查询接口之后返回的结果集合,提供了多种灵活的数据访问方式,以便用户获取各项数据。

都需先使用queryquerySqlremoteQueryqueryLockedRow等query类方法中任一方法获取到ResultSet实例

属性

名称类型必填说明
columnNamesstring[]获取结果集中所有列的名称。
columnCountnumber获取结果集中列的数量。
rowCountnumber获取结果集中行的数量。
rowIndexnumber获取结果集当前行的索引位置,默认值为-1。索引位置下标从0开始。
isAtFirstRowboolean检查结果集指针是否位于第一行(行索引为0),true表示位于第一行,false表示不位于第一行。
isAtLastRowboolean检查结果集指针是否位于最后一行,true表示位于最后一行,false表示不位于最后一行。
isEndedboolean检查结果集指针是否位于最后一行之后,true表示位于最后一行之后,false表示不位于最后一行之后。
isStartedboolean检查指针是否移动过,true表示指针已移动过,false表示指针未移动过。
isClosedboolean检查当前结果集是否关闭,true表示结果集已关闭,false表示结果集未关闭。

方法

方法名描述
getColumnIndex根据指定的列名获取列索引
getColumnName根据指定的列索引获取列名
getColumnType根据指定的列索引或列名称获取列数据类型
getColumnTypeSync根据指定的列索引或列名称获取列数据类型。(同步方法,api18以上)
goTo指定相对当前结果集指针位置的偏移量,以移动结果集的指针位置。
goToRow转到结果集的指定行。
goToFirstRow转到结果集的第一行
goToLastRow转到结果集的最后一行
goToNextRow转到结果集的下一行
goToPreviousRow转到结果集的上一行
getValue返回当前行指定列的值
getBlob返回当前行指定列的值 (字节数组形式)
getString以字符串形式获取当前行中指定列的值
getLong以Long形式获取当前行中指定列的值
getDouble以double形式获取当前行中指定列的值
getAssetAsset形式获取当前行中指定列的值
getAssetsAssets形式获取当前行中指定列的值
getRow获取当前行
getRows从结果集中获取指定数量的数据 (api18以上)
getSendableRow获取当前行数据的sendable形式,用于跨线程传递。
isColumnNull检查当前行中指定列的值是否为null。
close关闭结果集,若不关闭可能会引起fd泄露和内存泄露

Interface (Transaction, api14以上)

提供以事务方式管理数据库的方法。事务对象是通过createTransaction接口创建的,不同事务对象之间的操作是隔离的,不同类型事务的区别见TransactionType 。

当前关系型数据库同一时刻仅支持一个写事务,所以如果当前RdbStore存在写事务未释放,创建IMMEDIATE或EXCLUSIVE事务会返回14800024错误码。如果是创建的DEFERRED事务,则可能在首次使用DEFERRED事务调用写操作时返回14800024错误码。通过IMMEDIATE或EXCLUSIVE创建写事务或者DEFERRED事务升级到写事务之后,RdbStore的写操作也会返回14800024错误码。

当事务并发量较高且写事务持续时间较长时,返回14800024错误码的次数可能会变多,开发者可以通过减少事务占用时长减少14800024出现的次数,也可以通过重试的方式处理14800024错误码。

方法

方法描述
commit提交已执行的SQL语句
rollback回滚已经执行的SQL语句。
insert向目标表中插入一行数据
insertSync向目标表中插入一行数据(同步)
batchInsert向目标表中插入一组数据
batchInsertSync向目标表中插入一组数据(同步)
batchInsertWithConflictResolution向目标表中插入一组数据(api18以上)
batchInsertWithConflictResolutionSync向目标表中插入一组数据(api18以上, 同步)
update根据RdbPredicates的指定实例对象更新数据库中的数据
updateSync根据RdbPredicates的指定实例对象更新数据库中的数据(同步)
delete根据RdbPredicates的指定实例对象从数据库中删除数据
deleteSync根据RdbPredicates的指定实例对象从数据库中删除数据(同步)
query根据指定条件查询数据库中的数据
querySync根据指定条件查询数据库中的数据(同步)
querySql根据指定SQL语句查询数据库中的数据,SQL语句中的各种表达式和操作符之间的关系操作符号不超过1000个
querySqlSync根据指定SQL语句查询数据库中的数据,SQL语句中的各种表达式和操作符之间的关系操作符号不超过1000个(同步)
execute执行包含指定参数的SQL语句,语句中的各种表达式和操作符之间的关系操作符号不超过1000个,返回值类型为ValueType
executeSync执行包含指定参数的SQL语句,语句中的各种表达式和操作符之间的关系操作符号不超过1000个,返回值类型为ValueType(同步)