当前位置:   article > 正文

OpenHarmony关系型数据库[1]_import database from '@ohos.data.orm'这是什么接口

import database from '@ohos.data.orm'这是什么接口

1 概述

关系型数据库(Relational Database, 以下简称RDB)是一种基于关系模型来管理数据的数据库,是在SQLite基础上提供一套完整的对本地数据库进行管理的机制,为开发者提供无需编写原生SQL语句即可实现数据增、删、改、查等接口,同时开发者也可以直接运行原生SQL语句来满足复杂的场景需要。关系型数据库在应用卸载之后,才会被自动清除。

2 运作机制

RDB对外提供通用的接口,底层使用SQLite作为持久化存储引擎,支持SQLite具有的所有数据库特性。SQLite是一个进程内的库,具有自给自足、无服务、零配置、事务性特性的SQL数据库引擎。RDB包括但不限于事务、索引、视图、触发器、外键、参数化查询和预编译SQL语句。

3 使用场景

  • 通讯录

  • 记事本

  • 计算器历史记录

  • App用户登录信息

  • App主题

  • ...

4 流程

5 详细步骤

RDB对开发者提供的接口大部分为异步接口,均有callbackPromise两种返回形式,接下来将会一一介绍。

5.1 导入模块

import relationalStore from '@ohos.data.relationalStore';

5.2 配置数据库相关信息

创建数据库时需要配置数据库相关信息,RDB提供管理关系型数据库配置的StoreConfig接口,其参数如表5-1所示:

表5-1 关系型数据库配置参数

名称类型必填说明
namestring数据库文件名
securityLevelSecurityLevel(详见表5-2)设置数据库安全级别
encryptboolean指定数据库是否加密。
true:加密。
false:非加密。

表5-2 数据库的安全级别枚举

名称说明
S11数据库安全级别为低级别,当数据泄露时会产生较低影响。如包含壁纸等系统数据的数据库。
S22数据库安全级别为中级别,当数据泄露时会产生较大影响。如包含录音、视频等用户生成数据或通话记录等信息的数据库。
S33数据库安全级别为高级别,当数据泄露时会产生重大影响。如包含用户运动、健康、位置等信息的数据库。
S44数据库安全级别为关键级别,当数据泄露时会产生严重影响。如包含认证凭据、财务数据等信息的数据库。
  1. const store_config = {
  2.     name: "RdbSample.db",
  3.     securityLevel: relationalStore.SecurityLevel.S4,
  4.     encrypt: true
  5. }

5.3 创建数据库

和MySQL、Oracle等数据库类似,在使用之前需要先创建数据库,RDB提供了getRdbStore()方法用于创建数据库,该方法需要传入应用上下文Context和数据库配置信息StoreConfig两个参数,该方法有callbackPromise两种返回形式,如表5-3所示。 表5-3 数据库创建方法

方法名描述
getRdbStore(context: Context, config: StoreConfig, callback: AsyncCallback<RdbStore>): void获得一个相关的RdbStore,操作关系型数据库。
context: 应用上下文
config: 数据库配置信息
callback: 回调函数,返回RdbStore对象
getRdbStore(context: Context, config: StoreConfig): Promise<RdbStore>获得一个相关的RdbStore,操作关系型数据库。
context: 应用上下文
config: 数据库配置信息
Promise<RdbStore>: Promise对象,返回RdbStore对象
  1. // callback形式
  2. relationalStore.getRdbStore(this.context, STORE_CONFIG, (err, rdbStore) => {
  3.   if (err) {
  4.     Log.error(TAG, "Get RdbStore fialed, err: " + JSON.stringify(err))
  5.     return;
  6.   }
  7.   // rdbStore相关操作
  8.   Log.info(TAG, "Get RdbStore successfully.");
  9. })
  10. // Promise形式
  11. relationalStore.getRdbStore(this.context, STORE_CONFIG).then((rdbStore) => {
  12.   // rdbStore相关操作
  13.   Log.info(TAG, "Get RdbStore successfully.");
  14. }).catch((err) => {
  15.   Log.error(TAG, "Get RdbStore fialed, err: " + JSON.stringify(err))
  16. })

注:RDB不仅提供了数据库创建的方法,同时还提供了删除数据库方法,可以调用deleteRdbStore()方法进行数据库删除,使用方式和getRdbStore()方法类似。

5.4 数据表操作

创建数据库后,获取到RdbStore实例。RdbStore提供管理RDB方法的接口,在使用其增、删、改、查等接口之前,需要使用executeSql接口初始化数据表结构和相关数据。

5.4.1 创建数据表

executeSql()方法执行包含指定参数但不返回值得SQL语句,有callbackPromise两种形式,如表5-4所示。

表5-4 创建数据表方法

方法名描述
executeSql(sql: string,bindArgs: Array<ValueType>, callback: AsyncCallback<void>): void执行包含指定参数但不返回值得SQL语句。
sql: 指定要执行得SQL语句
bindArgs: SQL语句中参数的值
callback: 回调函数
executeSql(sql: string,bindArgs: Array<ValueType>): Promise<void>执行包含指定参数但不返回值得SQL语句。
sql: 指定要执行得SQL语句
bindArgs: SQL语句中参数的值
Promise<void>: 无返回结果的Promise对象

注:表中的ValueType用于表示允许的数据字段类型,当前仅支持表示值类型为数字的number,表示值类型为字符的string,表示值类型为布尔值的boolean

  1. const sql = "CREATE TABLE IF NOT EXISTS USER (ID INTEGER PRIMARY KEY AUTOINCREMENT, USERNAME TEXT NOT NULL, PASSWORD TEXT NOT NULL)"
  2. // callback形式
  3. rdbStore.executeSql(sql, null, (err) {
  4.   if (err) {
  5.     Log.error(TAG, "ExecuteSql failed, err: " + JSON.stringify(err));
  6.     return;
  7.   }
  8.   Log.info(TAG, "Create table done.");
  9. })
  10. // Promise形式
  11. rdbStore.executeSql(sql, null).then(() => {
  12.   Log.info(TAG, "Create table done.");
  13. }).catch((err) => {
  14.   Log.error(TAG, "ExecuteSql failed, err: " + JSON.stringify(err));
  15. })

5.4.2 新增数据

RdbStore提供了单条数据插入和批量数据插入两种为数据表新增数据的方法,如表5-5所示。

表5-5 新增数据方法

方法名描述
insert(table: string, values: ValuesBucket, callback: AsyncCallback<number>):void向表中插入一行数据。
table: 插入数据的目标表名称
values: 插入到表中的数据行
callback: 回调函数。插入成功,返回行ID,否则返回-1
insert(table: string, values: ValuesBucket): Promise<number>向表中插入一行数据。
table: 插入数据的目标表名称
values: 插入到表中的数据行
Promise<number>: Promise对象。插入成功,返回行ID,否则返回-1
batchInsert(table: string, values: Array<ValuesBucket>, callback: AsyncCallback<number>):void向表中插入一组数据
table: 插入数据的目标表名称
插入到表中的一组数据
callback: 回调函数。插入成功,返回插入的数据个数,否则返回-1
batchInsert(table: string, values: Array<ValuesBucket>):Promise<number>向表中插入一组数据
table: 插入数据的目标表名称
插入到表中的一组数据
Promise<number>: Promise对象。插入成功,返回插入的数据个数,否则返回-1

注:表5-5中ValuesBucket是用于存储键值对的类型,其键为string类型,值类型可为ValueType|Uint8Array|null

  1. const tableName = "USER";
  2. const valueBacket = {
  3.   "USERNAME""Admin",
  4.   "PASSWORD""123456"
  5. }
  6. // insert callback形式
  7. rdbStore.insert(tableName, valueBucket, (err, rowId) => {
  8.   if (err) {
  9.     Log.error(TAG, "Insert data failed, err: " + JSON.stringify(err));
  10.     return;
  11.   }
  12.   Log.info(TAG, "Insert data successful, rowId = " + rowId);
  13. })
  14. // insert Promise形式
  15. rdbStore.insert(tableName, valueBucket).then((rowId) => {
  16.   Log.info(TAG, "Insert data successful, rowId = " + rowId);
  17. }).catch((err) => {
  18.   Log.error(TAG, "Insert data failed, err: " + JSON.stringify(err));
  19. })
  20. const valueBuckets = [{
  21.   "USERNAME""aaa",
  22.   "PASSWORD""123456"
  23. }, {
  24.   "USERNAME""bbb",
  25.   "PASSWORD""123456"
  26. }]
  27. // batchInsert callback形式
  28. rdbStore.batchInsert(tableName, valueBuckets, (err, count=> {
  29.   if (err) {
  30.     Log.error(TAG, "batchInsert data failed, err: " + JSON.stringify(err));
  31.     return;
  32.   }
  33.   Log.info(TAG, "batchInsert data successful, count = " + count);
  34. })
  35. // batchInsert Promise形式
  36. rdbStore.batchInsert(tableName, valueBuckets).then((count=> {
  37.   Log.info(TAG, "batchInsert data successful, count = " + count);
  38. }).catch((err) => {
  39.   Log.error(TAG, "batchInsert data failed, err: " + JSON.stringify(err));
  40. })

5.4.3 更新数据

RdbStore提供了根据RdbPredicates指定实例对象和根据DataSharePredicates指定实例对象两种方式更新数据表中的数据,两种方式均有callbackPromise形式,如表5-6所示。

RdbPredicatesDataSharePredicates均用于数据表中用来代表数据实体的性质、特征或者数据实体之间关系的词项,主要用于定义数据表的操作条件。如设置根据账号查找用户信息的条件,或者根据账号修改用户密码的条件。两者区别在于使用前者需要先指定操作的数据表名称,同时前者为分布式数据操作做了扩充。使用后者需要导入新模块import dataSharePredicates from '@ohos.data.dataSharePredicates';

表5-6 更新数据方法

方法名描述
update(values: ValuesBucket, predicates: RdbPredicates, callback: AsyncCallback<number>):void根据RdbPredicates的指定实例对象更新数据库中的数据。
values: 数据表中要更新的数据行
predicates: RdbPredicates的实例对象指定的更新条件
callback: 回调函数,返回受影响的行数
update(values: ValuesBucket, predicates: RdbPredicates):Promise<number>根据RdbPredicates的指定实例对象更新数据库中的数据。
values: 数据表中要更新的数据行
predicates: RdbPredicates的实例对象指定的更新条件
Promise<number>: Promise对象,返回受影响的行数
update(table: string, values: ValuesBucket, predicates: dataSharePredicates.DataSharePredicates, callback: AsyncCallback<number>): void根据DataSharePredicates的指定实例对象更新数据表的数据。
table: 更新数据表的名称
values: 数据表中要更新的数据行
predicates: DataSharePredicates的实例对象指定的更新条件
callback: 回调函数,返回受影响的行数
update(table: string, values: ValuesBucket, predicates: dataSharePredicates.DataSharePredicates): Promise<number>根据DataSharePredicates的指定实例对象更新数据表的数据。
table: 更新数据表的名称
values: 数据表中要更新的数据行
predicates: DataSharePredicates的实例对象指定的更新条件
Promise<number>: Promise对象,返回受影响的行数
  1. const tableName = "USER";
  2. const valueBucket = {
  3.   "USERNAME""aaa",
  4.   "PASSWORD""123456789"
  5. }
  6. // RdbPredicates
  7. let predicates = new relationalStore.RdbPredicates(tableName);
  8. predicates.equalTo("USERNAME""aaa");
  9. // update callback形式
  10. rdbStore.update(valueBucket, predicates, (err, rows) => {
  11.   if (err) {
  12.     Log.error(TAG, "Updated failed, err: " + JSON.stringify(err));
  13.     return;
  14.   }
  15.   Log.info(TAG, "Updated row count: " + rows);
  16. })
  17. // update Promise形式
  18. rdbStore.update(valueBucket, predicates).then((rows) => {
  19.   Log.info(TAG, "Updated row count: " + rows);
  20. }).catch((err) => {
  21.   Log.error(TAG, "Updated failed, err: " + JSON.stringify(err));
  22. })
  23. // DataSharePredicates
  24. let predicates = new dataSharePredicates.DataSharePredicates();
  25. predicates.equalTo("USERNAME""aaa");
  26. // update callback形式
  27. rdbStore.update(tableName, valueBucket, predicates, (err, rows) => {
  28.   if (err) {
  29.     Log.error(TAG, "Updated failed, err: " + JSON.stringify(err));
  30.     return;
  31.   }
  32.   Log.info(TAG, "Updated row count: " + rows);
  33. })
  34. // update Promise形式
  35. rdbStore.update(tableName, valueBucket, predicates).then((rows) => {
  36.   Log.info(TAG, "Updated row count: " + rows);
  37. }).catch((err) => {
  38.   Log.error(TAG, "Updated failed, err: " + JSON.stringify(err));
  39. })

5.4.4 查询数据

数据表数据的查询和更新相似,RdbStore也提供了RdbPredicatesDataSharePredicates两种方式,如表5-7所示。不同之处在于返回的结果不同,更新数据返回受影响的行数,查询数据返回的数据结果集ResultSet,关于结果集详细讲解将在下一节介绍。

表5-7 查询数据方法

方法名描述
query(predicates: RdbPredicates, columns: Array<string>, callback: AsyncCallback<ResultSet>): void根据RdbPredicates的指定实例对象条件查询数据表中的数据。
predicates: RdbPredicates的实例对象指定的查询条件
columns: 查询的列名称,为空则表示查询所有列
callback: 回调函数,操作成功,返回ResultSet对象
query(predicates: RdbPredicates, columns: Array<string>): Promise<ResultSet>根据RdbPredicates的指定实例对象条件查询数据表中的数据。
predicates: RdbPredicates的实例对象指定的查询条件
columns: 查询的列名称,为空则表示查询所有列
Promise<ResultSet>: Promise对象,操作成功,返回ResultSet对象
query(table: string, predicates: dataSharePredicates.DataSharePredicates, columns: Array<string>, callback: AsyncCallback<ResultSet>): void根据DataSharePredicates的指定实例对象条件查询数据表中的数据。
table: 查询数据表名称
predicates: DataSharePredicates的实例对象指定的查询条件
columns: 查询的列名称,为空则表示查询所有列
callback: 回调函数,操作成功,返回ResultSet对象
query(table: string, predicates: dataSharePredicates.DataSharePredicates, columns: Array<string>): Promise<ResultSet>根据DataSharePredicates的指定实例对象条件查询数据表中的数据。
table: 查询数据表名称
predicates: DataSharePredicates的实例对象指定的查询条件
columns: 查询的列名称,为空则表示查询所有列
Promise<ResultSet>: Promise对象,操作成功,返回ResultSet对象
  1. const tableName = "USER";
  2. // RdbPredicates
  3. let predicates = new relationalStore.RdbPredicates(tableName);
  4. predicates.equalTo("USERNAME""aaa");
  5. // query callback形式
  6. rdbStore.query(predicates, null, (err, resultSet) => {
  7.   if (err) {
  8.     Log.error(TAG, "Query failed, err: " + JSON.stringify(err));
  9.     return;
  10.   }
  11.   Log.info(TAG, "Query successful.");
  12.   Log.info(TAG, "ResultSet column count: " + resultSet.columnCount);
  13. })
  14. // query Promise形式
  15. rdbStore.query(predicates, null).then((resultSet) => {
  16.   Log.info(TAG, "Query successful.");
  17.   Log.info(TAG, "ResultSet column count: " + resultSet.columnCoun
  18. }).catch((err) => {
  19.     Log.error(TAG, "Query failed, err: " + JSON.stringify(err));
  20. })
  21. // DataSharePredicates
  22. let predicates = new dataSharePredicates.DataSharePredicates();
  23. predicates.equalTo("USERNAME""aaa");
  24. // query callback形式
  25. rdbStore.query(tableName, predicates, null, (err, resultSet) => {
  26.   if (err) {
  27.     Log.error(TAG, "Query failed, err: " + JSON.stringify(err));
  28.     return;
  29.   }
  30.   Log.info(TAG, "Query successful.");
  31.   Log.info(TAG, "ResultSet column count: " + resultSet.columnCount);
  32. })
  33. // query Promise形式
  34. rdbStore.query(tableName, predicates, null).then((resultSet) => {
  35.   Log.info(TAG, "Query successful.");
  36.   Log.info(TAG, "ResultSet column count: " + resultSet.columnCount);
  37. }).catch((err) => {
  38.     Log.error(TAG, "Query failed, err: " + JSON.stringify(err));
  39. })

5.4.5 删除数据

表5-8 删除数据方法

方法名描述
delete(predicates: RdbPredicates, callback: AsyncCallback<number>):void根据RdbPredicates指定实例对象从数据表中删除数据
predicates: RdbPredicates实例对象指定的删除条件
callback: 回调函数,返回受影响的行数
delete(predicates: RdbPredicates):Promise<number>根据RdbPredicates指定实例对象从数据表中删除数据
predicates: RdbPredicates实例对象指定的删除条件
Promise<number>: Promise对象,返回受影响的行数
delete(table: string, predicates: dataSharePredicates.DataSharePredicates, callback: AsyncCallback<number>):void根据DataSharePredicates指定实例对象从数据表中删除数据
table: 删除数据的数据表名称
predicates: DataSharePredicates实例对象指定的删除条件
callback: 回调函数,返回受影响的行数
delete(table: string, predicates: dataSharePredicates.DataSharePredicates):Promise<number>根据DataSharePredicates指定实例对象从数据表中删除数据
table: 删除数据的数据表名称
predicates: DataSharePredicates实例对象指定的删除条件
Promise<number>: 回调函数,返回受影响的行数
  1. const tableName = "USER";
  2. // RdbPredicates
  3. let predicates = new relationalStore.RdbPredicates(tableName);
  4. predicates.equalTo("USERNAME""aaa");
  5. // delete callback
  6. rdbStore.delete(predicates, (err, rows) => {
  7.   if (err) {
  8.     Log.error(TAG, "Delete failed, err: " + JSON.string(err));
  9.     return;
  10.   }
  11.   Log.info(TAG, "Delete rows: " + rows);
  12. })
  13. // delete Promise
  14. rdbStore.delete(predicates).then((rows) => {
  15.   Log.info(TAG, "Delete rows: " + rows);
  16. }).catch((err) => {
  17.   Log.error(TAG, "Delete failed, err: " + JSON.string(err));
  18. })
  19. // DataSharePredicates
  20. let predicates = new dataSharePredicates.DataSharePredicates();
  21. predicates.equalTo("USERNAME""aaa");
  22. // delete callback
  23. rdbStore.delete(tableName, predicates, (err, rows) => {
  24.   if (err) {
  25.     Log.error(TAG, "Delete failed, err: " + JSON.string(err));
  26.     return;
  27.   }
  28.   Log.info(TAG, "Delete rows: " + rows);
  29. })
  30. // delete Promise
  31. rdbStore.delete(tableName, predicates).then((rows) => {
  32.   Log.info(TAG, "Delete rows: " + rows);
  33. }).catch((err) => {
  34.   Log.error(TAG, "Delete failed, err: " + JSON.string(err));
  35. })

6 原生SQL操作数据表

RdbStore不仅提供了适用于增删改查简单易操作的接口方法,同时还支持原生SQL语句的操作。

  • querySql()方法支持使用指定SQL语句查询数据表中的数据

  1. const sql = "select * from user";
  2. rdbStore.querySql(sql).then((resultSet) => {
  3.   Log.info(TAG, "Query successful.");
  4.   Log.info(TAG, "ResultSet column count: " + resultSet.columnCount);
  5. }).catch((err) => {
  6.     Log.error(TAG, "Query failed, err: " + JSON.stringify(err));
  7. })

7 小节

当然RdbStore还提供了其他的方法,诸如在开始执行SQL语句之前开启事务的beginTransaction()方法、提交已执行的SQL语句的commit()方法、回滚已执行的SQL语句的rollBack()方法以及用于其他能力的方法。本节仅对RDB数据库的简单使用做了讲解,其中涉及到RdbPredicatesDataSharePredicatesResultSet相关的更多内容将在后续封装RDB工具类中详细介绍。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/294874
推荐阅读
相关标签
  

闽ICP备14008679号