写点什么

鸿蒙开发之如何使用关系型数据库进行关联查询

作者:彭康佳
  • 2024-06-27
    广东
  • 本文字数:2524 字

    阅读完需:约 8 分钟

关系型数据库(@ohos.data.relationalStore)详解

在 HarmonyOS 中,关系型数据库(Relational Database,RDB)是基于 SQLite 组件提供的一套完整的本地数据库管理机制。它对外提供了一系列的增、删、改、查等接口,并且支持直接运行用户输入的 SQL 语句来满足复杂的场景需求。该模块支持的基本数据类型包括 number、string、二进制类型数据、boolean,并且建议一条数据不要超过 2M 以确保插入并读取数据成功。

主要功能

  1. RdbPredicates:用于定义数据库操作条件,代表数据实体的性质、特征或者数据实体之间关系的词项。

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

  3. ResultSet:提供用户调用关系型数据库查询接口之后返回的结果集合。

模块导入示例

import relationalStore from '@ohos.data.relationalStore';
复制代码

获取 RdbStore 示例

let store: relationalStore.RdbStore | undefined = undefined;let context = getContext(this);const STORE_CONFIG: relationalStore.StoreConfig = { name: "RdbTest.db", securityLevel: relationalStore.SecurityLevel.S1 };relationalStore.getRdbStore(context, STORE_CONFIG, (err: BusinessError, rdbStore: relationalStore.RdbStore) => {  store = rdbStore;  if (err) {    console.error(`Get RdbStore failed, code is ${err.code},message is ${err.message}`);    return;  }  console.info('Get RdbStore successfully.');})
复制代码

删除 RdbStore 示例

relationalStore.deleteRdbStore(context, "RdbTest.db", (err: BusinessError) => {  if (err) {    console.error(`Delete RdbStore failed, code is ${err.code},message is ${err.message}`);    return;  }  store = undefined;  console.info('Delete RdbStore successfully.');})
复制代码

数据库操作示例

  • 创建 RdbPredicates 对象


  let predicates = new relationalStore.RdbPredicates("EMPLOYEE");
复制代码


  • 设置查询条件


  predicates.lessThan("AGE", 20);  predicates.greaterThanOrEqualTo("AGE", 18);  predicates.lessThanOrEqualTo("AGE", 20);
复制代码


  • 排序


  predicates.orderByAsc("NAME");  predicates.orderByDesc("AGE");
复制代码


  • 去重


  predicates.equalTo("NAME", "Rose").distinct();
复制代码


  • 限制返回记录数


  predicates.equalTo("NAME", "Rose").limitAs(3);
复制代码


  • 设置结果起始位置


  predicates.equalTo("NAME", "Rose").offsetAs(3);
复制代码


  • 分组


  predicates.groupBy(["AGE", "NAME"]);
复制代码


  • 使用索引


  predicates.indexedBy("SALARY");
复制代码


  • 范围查询


  predicates.in("AGE", [18, 20]);  predicates.notIn("NAME", ["Lisa", "Rose"]);
复制代码

错误码和数据库操作

  • 错误码:包括通用错误码和关系型数据库错误码,如参数错误、内部错误、数据库损坏等。

  • 事务处理:包括beginTransaction()commit()rollback()等方法。

  • 备份与恢复:使用backup()restore()方法。

  • 分布式表设置:使用setDistributedTables()obtainDistributedTableName()方法。

  • 数据同步:使用sync()cloudSync()方法。

代码示例

// 远程查询示例(store as relationalStore.RdbStore).remoteQuery(deviceId, "EMPLOYEE", predicates, ["ID", "NAME", "AGE", "SALARY", "CODES"]).then((resultSet: relationalStore.ResultSet) => {    console.info(`ResultSet column names: ${resultSet.columnNames}, column count: ${resultSet.columnCount}`);    while (resultSet.goToNextRow()) {        const id = resultSet.getLong(resultSet.getColumnIndex("ID"));        const name = resultSet.getString(resultSet.getColumnIndex("NAME"));        const age = resultSet.getLong(resultSet.getColumnIndex("AGE"));        const salary = resultSet.getDouble(resultSet.getColumnIndex("SALARY"));        console.info(`id=${id}, name=${name}, age=${age}, salary=${salary}`);    }    resultSet.close();}).catch((err: BusinessError) => {    console.error(`Failed to remoteQuery, code is ${err.code},message is ${err.message}`);});
复制代码

如何在关系型数据库中进行关联查询

在关系型数据库中进行关联查询是一个常见的需求,它允许我们从多个表中检索数据,并根据这些表之间的共同字段将它们组合起来。在 HarmonyOS 的 @ohos.data.rdb 模块中,虽然没有直接提供 SQL 语句的执行接口,但提供了类似的功能通过 RdbPredicates 和 RdbStore 接口来实现。

步骤和知识点

  1. 创建 RdbPredicates 对象

  2. 使用new data_rdb.RdbPredicates(tableName)创建一个谓词对象,其中tableName是数据库中的表名。

  3. 设置查询条件

  4. 使用谓词对象的方法(如equalTo, in, notIn等)设置查询条件。这些方法允许你指定字段和值,以便进行精确或范围查询。

  5. 执行查询

  6. 使用 RdbStore 的query方法执行查询。这个方法接受一个 RdbPredicates 对象,并返回一个 Promise,该 Promise 解析为查询结果。

代码示例和解释

let predicates = new data_rdb.RdbPredicates("EMPLOYEE");predicates.equalTo("DEPT_ID", 100); // 假设DEPT_ID是部门表和员工表共有的字段
rdbStore.query(predicates, (err, resultSet) => { if (err) { console.error("Query failed: " + err); return; } // 处理查询结果 for (let i = 0; i < resultSet.columnCount; i++) { let columnName = resultSet.getColumnName(i); console.log("Column: " + columnName); } while (resultSet.goToNextRow()) { for (let i = 0; i < resultSet.columnCount; i++) { let value = resultSet.getRowData(i); console.log(columnName + ": " + value); } }});
复制代码


在这个示例中,我们首先创建了一个 RdbPredicates 对象,并设置了查询条件(员工表中 DEPT_ID 等于 100 的记录)。然后,我们使用 RdbStore 的query方法执行查询,并处理返回的结果集。

总结

通过使用 RdbPredicates 设置查询条件和 RdbStore 执行查询,你可以在 HarmonyOS 的关系型数据库中实现复杂的关联查询,类似于传统 SQL 中的 JOIN 操作。这种方法虽然不同于直接编写 SQL 语句,但提供了灵活性和对查询条件的精细控制。

发布于: 刚刚阅读数: 5
用户头像

彭康佳

关注

还未添加个人签名 2018-12-19 加入

还未添加个人简介

评论

发布
暂无评论
鸿蒙开发之如何使用关系型数据库进行关联查询_android_彭康佳_InfoQ写作社区