
【鸿蒙开发】关系型数据库 原创
前言
关系型数据库(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 | 云端自动同步进度通知,自动同步进行时调用回调 |
statistics | sql执行时间的统计 |
sqliteErrorOccurred | 执行SQL语句时的异常日志(api20以上) |
perfStat | 统计执行SQL的时间(事务结束)。 |
ResultSet
提供通过查询数据库生成的数据库结果集的访问方法。结果集是指用户调用关系型数据库查询接口之后返回的结果集合,提供了多种灵活的数据访问方式,以便用户获取各项数据。
都需先使用query、querySql、remoteQuery、queryLockedRow等query类方法中任一方法获取到ResultSet实例
属性
名称 | 类型 | 必填 | 说明 |
---|---|---|---|
columnNames | string[] | 是 | 获取结果集中所有列的名称。 |
columnCount | number | 是 | 获取结果集中列的数量。 |
rowCount | number | 是 | 获取结果集中行的数量。 |
rowIndex | number | 是 | 获取结果集当前行的索引位置,默认值为-1。索引位置下标从0开始。 |
isAtFirstRow | boolean | 是 | 检查结果集指针是否位于第一行(行索引为0),true表示位于第一行,false表示不位于第一行。 |
isAtLastRow | boolean | 是 | 检查结果集指针是否位于最后一行,true表示位于最后一行,false表示不位于最后一行。 |
isEnded | boolean | 是 | 检查结果集指针是否位于最后一行之后,true表示位于最后一行之后,false表示不位于最后一行之后。 |
isStarted | boolean | 是 | 检查指针是否移动过,true表示指针已移动过,false表示指针未移动过。 |
isClosed | boolean | 是 | 检查当前结果集是否关闭,true表示结果集已关闭,false表示结果集未关闭。 |
方法
方法名 | 描述 |
---|---|
getColumnIndex | 根据指定的列名获取列索引 |
getColumnName | 根据指定的列索引获取列名 |
getColumnType | 根据指定的列索引或列名称获取列数据类型 |
getColumnTypeSync | 根据指定的列索引或列名称获取列数据类型。(同步方法,api18以上) |
goTo | 指定相对当前结果集指针位置的偏移量,以移动结果集的指针位置。 |
goToRow | 转到结果集的指定行。 |
goToFirstRow | 转到结果集的第一行 |
goToLastRow | 转到结果集的最后一行 |
goToNextRow | 转到结果集的下一行 |
goToPreviousRow | 转到结果集的上一行 |
getValue | 返回当前行指定列的值 |
getBlob | 返回当前行指定列的值 (字节数组形式) |
getString | 以字符串形式获取当前行中指定列的值 |
getLong | 以Long形式获取当前行中指定列的值 |
getDouble | 以double形式获取当前行中指定列的值 |
getAsset | 以Asset形式获取当前行中指定列的值 |
getAssets | 以Assets形式获取当前行中指定列的值 |
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(同步) |
