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

941 阅读3分钟

关系型数据库(@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对象

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

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

    • 使用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语句,但提供了灵活性和对查询条件的精细控制。