【鸿蒙】数据管理--关系型数据库
关系型数据库概述
关系型数据库(Relational Database,RDB)是⼀种基于关系模型来管理数据的数据库。HarmonyOS关系型数据库基于SQLite组件提供了⼀套完整的对本地数据库进⾏管理的机制,对外提供了⼀系列的增、删、改、查等接⼝,也可以直接运⾏⽤户输⼊的SQL语句来满⾜复杂的场景需要。HarmonyOS提供的关系型数据库功能更加完善,查询效率更加⾼效。
基本概念
关系型数据库
基于关系模型来管理数据的数据库,以⾏和列的形式存储数据。
谓词
数据库中⽤来代表数据实体的性质、特征或者数据实体之间关系的词项,主要⽤来定义数据库的操作条件。
结果集
指⽤户查询之后的结果集合,可以对数据进⾏访问。结果集提供了灵活的数据访问⽅式,可以更⽅便的拿到⽤户想要的数据。
SQLite数据库
⼀款轻型的数据库,是遵守ACID的关系型数据库管理系统。它是⼀个开源的项⽬。
运作机制
HarmonyOS关系型数据库对外提供通⽤的操作接⼝,底层使⽤SQLite作为持久化存储引擎,⽀持SQLite具有的所有数据库特性,包括但不限于事务、索引、视图、触发器、外键、参数化查询和预编译SQL语句。
图1 关系型数据库运作机制
默认配置
如果不指定数据库的⽇志模式,那么系统默认⽇志⽅式是WAL(Write Ahead Log)模式。
如果不指定数据库的落盘模式,那么系统默认落盘⽅式是FULL模式。
HarmonyOS数据库使⽤的共享内存默认⼤⼩是2MB。
约束与限制
数据库中连接池的最⼤数量是4个,⽤以管理⽤户的读写操作。
为保证数据的准确性,数据库同⼀时间只能⽀持⼀个写操作。
场景介绍
关系型数据库是在SQLite基础上实现的本地数据操作机制,提供给⽤户⽆需编写原⽣SQL语句就能进⾏数据增删改查的⽅法,同时也⽀持原⽣SQL语句操作。
接⼝说明
数据库的创建和删除
关系型数据库提供了数据库创建⽅式,以及对应的删除接⼝,涉及的API如下所⽰。
数据库的加密
关系型数据库提供数据库加密的能⼒,在创建数据库时若指定了密钥,则会创建为加密数据库再次使⽤此数据库时,仍需要指定相同密钥,才能正确打开数据库。
表2 数据库传⼊密钥接⼝
类名接⼝名描述
StoreConfig.Builder public StoreConfig.Builder
setEncryptKey(byte[] encryptKey)为数据库设置数据库加密密钥的配置类,创建或打开数据库时传⼊包含数据库加密密钥的配置类,即可创建或打开加密数据库。
数据库的增删改查
关系型数据库提供对本地数据增删改查操作的能⼒,相关API如下所⽰。
新增关系型数据库提供了插⼊数据的接⼝,通过ValuesBucket输⼊要存储的数据,通过返回值判断是否插⼊成功,插⼊成功时返回最新插⼊数据所在的⾏号,失败时则返回-1。
更新
调⽤更新接⼝,传⼊要更新的数据,并通过AbsRdbPredicates指定更新条件。该接⼝的返回值表⽰更新操作影响的⾏数。如果更新失败,则返回0。
删除
调⽤删除接⼝,通过AbsRdbPredicates指定删除条件。该接⼝的返回值表⽰删除的数据⾏数,可根据此值判断是否删除成功。如果删除失败,则返回0。
表5 数据库删除API
查询
关系型数据库提供了两种查询数据的⽅式:
直接调⽤查询接⼝。使⽤该接⼝,会将包含查询条件的谓词⾃动拼接成完整的SQL语句进⾏查询操作,⽆需⽤户传⼊原⽣的SQL语句。
执⾏原⽣的SQL语句进⾏查询操作。
表6 数据库查询API
类名接⼝名描述
RdbStore查询数据。
数据库谓词的使⽤
关系型数据库提供了⽤于设置数据库操作条件的谓词AbsRdbPredicates,其中包括两个实现⼦类RdbPredicates和RawRdbPredicates:
RdbPredicates:开发者⽆需编写复杂的SQL语句,仅通过调⽤该类中条件相关的⽅法,如equalTo、notEqualTo、groupBy、orderByAsc、beginsWith等,就可⾃动完成SQL语句拼接,⽅便⽤户聚焦业务操作。
RawRdbPredicates:可满⾜复杂SQL语句的场景,⽀持开发者⾃⼰设置where条件⼦句和whereArgs参数。不⽀持equalTo等条件接⼝的使⽤。
表7 数据库谓词API
类名接⼝名描述
RdbPredicates RdbPredicates equalTo(String field, String
value)
设置谓词条件,满⾜field字段与value值相等。
RdbPredicates RdbPredicates notEqualTo(String field, String
value)
设置谓词条件,满⾜field字段与value值不相等。基本的增删改查语句
RdbPredicates RdbPredicates beginsWith(String field, String
value)
设置谓词条件,满⾜field字段以value值开头。
RdbPredicates RdbPredicates between(String field, int low, int
high)设置谓词条件,满⾜field字段在最⼩值low和最⼤值high 之间。
RdbPredicates RdbPredicates orderByAsc(String field)设置谓词条件,根据field字段升序排列。RawRdbPredicates void setWhereClause(String whereClause)设置where条件⼦句。
RawRdbPredicates void setWhereArgs(List<String> whereArgs)设置whereArgs参数,该值表⽰where⼦句中占位符的
值。
查询结果集的使⽤
关系型数据库提供了查询返回的结果集ResultSet,其指向查询结果中的⼀⾏数据,供⽤户对查询结果进⾏遍历和访问。ResultSet对外API 如下所⽰。
表8 结果集API
类名接⼝名描述
ResultSet boolean goTo(int offset)从结果集当前位置移动指定偏移量。
ResultSet boolean goToRow(int position)将结果集移动到指定位置。
ResultSet boolean goToNextRow()将结果集向后移动⼀⾏。
ResultSet boolean goToPreviousRow()将结果集向前移动⼀⾏。
ResultSet boolean isStarted()判断结果集是否被移动过。
ResultSet boolean isEnded()判断结果集当前位置是否在最后⼀⾏之后。
ResultSet boolean isAtFirstRow()判断结果集当前位置是否在第⼀⾏。
ResultSet boolean isAtLastRow()判断结果集当前位置是否在最后⼀⾏。
ResultSet int getRowCount()获取当前结果集中的记录条数。
ResultSet int getColumnCount()获取结果集中的列数。
ResultSet String getString(int columnIndex)获取当前⾏指定列的值,以String类型返回。
ResultSet byte[] getBlob(int columnIndex)获取当前⾏指定列的值,以字节数组形式返回。
ResultSet double getDouble(int columnIndex)获取当前⾏指定列的值,以double型返回。
类名接⼝名描述
事务
关系型数据库提供事务机制,来保证⽤户操作的原⼦性。对单条数据进⾏数据库操作时,⽆需开启事务;插⼊⼤量数据时,开启事务可以保证数据的准确性。如果中途操作出现失败,会⾃动执⾏回滚操作。
表9 事务API
类名接⼝名描述
RdbStore void beginTransaction()开启事务。
RdbStore void markAsCommit()设置事务的标记为成功。
RdbStore void endTransaction()结束事务。当调⽤此⽅法前若执⾏markAsCommit⽅法,事务会提交,否则事务会⾃动回滚。事务和结果集观察者
关系型数据库提供了事务和结果集观察者能⼒,当对应的事件被触发时,观察者会收到通知。
类名接⼝名描述
RdbStore void beginTransactionWithObserver(TransactionObserver transactionObserver)开启事务,并观察事务的启动、提交和回滚。
ResultSet void registerObserver(DataObserver observer)注册结果集的观察者。
ResultSet void unregisterObserver(DataObserver observer)注销结果集的观察者。
数据库的备份和恢复
⽤户可以将当前数据库的数据进⾏保存备份,还可以在需要的时候进⾏数据恢复。
表10 数据库备份和恢复
类名接⼝名描述
RdbStore boolean restore(String srcName)数据库恢复接⼝,从指定的⾮加密数据库⽂件中恢复数
据。
RdbStore boolean restore(String srcName, byte[] srcEncryptKey, byte[] destEncryptKey)数据库恢复接⼝,从指定的数据库⽂件(加密和⾮加密均可)中恢复数据。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论