【鸿蒙开发】关系型数据库 原创
前言
关系型数据库(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(同步) |



















