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

关系型数据库(@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语句,但提供了灵活性和对查询条件的精细控制。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鸿蒙开发助手

赏钱一扔,代码超神,事业飞腾

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值