关系型数据库(@ohos.data.relationalStore)详解
在HarmonyOS中,关系型数据库(Relational Database,RDB)是基于SQLite组件提供的一套完整的本地数据库管理机制。它对外提供了一系列的增、删、改、查等接口,并且支持直接运行用户输入的SQL语句来满足复杂的场景需求。该模块支持的基本数据类型包括number、string、二进制类型数据、boolean,并且建议一条数据不要超过2M以确保插入并读取数据成功。
主要功能
- RdbPredicates:用于定义数据库操作条件,代表数据实体的性质、特征或者数据实体之间关系的词项。
- RdbStore:提供管理关系数据库(RDB)方法的接口。
- 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接口来实现。
步骤和知识点
-
创建RdbPredicates对象:
- 使用
new data_rdb.RdbPredicates(tableName)
创建一个谓词对象,其中tableName
是数据库中的表名。
- 使用
-
设置查询条件:
- 使用谓词对象的方法(如
equalTo
,in
,notIn
等)设置查询条件。这些方法允许你指定字段和值,以便进行精确或范围查询。
- 使用谓词对象的方法(如
-
执行查询:
- 使用RdbStore的
query
方法执行查询。这个方法接受一个RdbPredicates对象,并返回一个Promise,该Promise解析为查询结果。
- 使用RdbStore的
代码示例和解释
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语句,但提供了灵活性和对查询条件的精细控制。