RdbPredicates 是鸿蒙(HarmonyOS)关系型数据库(Relational Database, RDB)中用于 构建数据查询条件 的核心工具类。它封装了 SQL 查询条件的语法,提供类型安全且链式调用的 API,用于替代直接编写 SQL 语句的 WHERE
子句。
一、核心作用
- 数据过滤
定义SELECT
操作的筛选规则,如=
、>
、LIKE
等条件。 - 排序与分页
指定结果集的排序方式(升序/降序)和分页参数(偏移量、每页数量)。 - 联合查询
支持多表JOIN
查询的条件构建(需结合rdb.rawRdbSet
使用)。 - 防 SQL 注入
通过参数化查询避免字符串拼接导致的安全风险。
二、与传统 SQL 的对比
操作 | 原生 SQL 写法 | RdbPredicates 写法 |
---|---|---|
等于条件 | WHERE name = 'Alice' | .equalTo("name", "Alice") |
范围查询 | WHERE age BETWEEN 18 AND 30 | .between("age", 18, 30) |
模糊查询 | WHERE title LIKE '%Harmony%' | .like("title", "%Harmony%") |
排序 | ORDER BY create_time DESC | .orderByDesc("create_time") |
分页 | LIMIT 10 OFFSET 20 | .offset(20).limit(10) |
逻辑组合 | WHERE (age > 18) AND (gender = 1) | .greaterThan("age", 18).and().equalTo("gender", 1) |
三、核心 API 及使用示例
1. 初始化
import relationalStore from '@ohos.data.relationalStore';
// 创建 RdbPredicates 对象,指定目标表名
const predicates = new relationalStore.RdbPredicates('users');
2. 条件设置
// 链式调用组合条件
predicates
.equalTo('gender', 1) // gender = 1
.and() // 逻辑与
.greaterThanOrEqualTo('age', 18) // age >= 18
.or() // 逻辑或
.like('name', '%张%') // name LIKE '%张%'
.orderByAsc('create_time') // 按创建时间升序
.limit(10) // 最多返回 10 条
.offset(20); // 从第 21 条开始
3. 执行查询
// 获取 RdbStore 实例
const rdbStore = await relationalStore.getRdbStore(context, config);
// 执行查询
const resultSet = await rdbStore.query(predicates, ['id', 'name', 'age']);
// 遍历结果
while (resultSet.goToNextRow()) {
const id = resultSet.getLong(resultSet.getColumnIndex('id'));
const name = resultSet.getString(resultSet.getColumnIndex('name'));
console.log(`ID: ${id}, Name: ${name}`);
}
四、高级用法
1. 多表联合查询
const userPredicates = new relationalStore.RdbPredicates('users')
.equalTo('status', 1);
const orderPredicates = new relationalStore.RdbPredicates('orders')
.greaterThan('amount', 100);
// 假设已通过 rawRdbSet 创建联合表关系
const joinPredicates = relationalStore.RdbPredicates.join(
userPredicates,
orderPredicates,
'users.id = orders.user_id'
);
2. 动态条件构建
function buildSearchPredicates(keyword?: string, minAge?: number) {
const predicates = new relationalStore.RdbPredicates('users');
if (keyword) {
predicates.like('name', `%${keyword}%`);
}
if (minAge) {
predicates.greaterThanOrEqualTo('age', minAge);
}
return predicates;
}
// 使用动态条件查询
const dynamicPredicates = buildSearchPredicates('王', 20);
const result = await rdbStore.query(dynamicPredicates);
3. 批量操作条件
// 删除所有男性用户
const deletePredicates = new relationalStore.RdbPredicates('users')
.equalTo('gender', 1);
await rdbStore.delete(deletePredicates);
// 更新年龄大于 60 的用户状态
const updatePredicates = new relationalStore.RdbPredicates('users')
.greaterThan('age', 60);
const values = { status: 'retired' };
await rdbStore.update(values, updatePredicates);
五、最佳实践
-
索引优化
对高频查询字段(如user_id
、create_time
)添加索引:// 建表时定义索引 const CREATE_TABLE_SQL = ` CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER, gender INTEGER, INDEX idx_age_gender (age, gender) )`;
-
避免全表扫描
- 尽量使用
equalTo
替代like
- 限制
offset
分页深度(大数据集改用游标分页)
- 尽量使用
-
参数化输入
// 安全 ✅ .equalTo('name', userInputName); // 危险 ❌(直接拼接 SQL) const unsafeSql = `SELECT * FROM users WHERE name = '${userInputName}'`;
六、常见问题
1. 如何实现 OR
条件嵌套?
predicates
.beginWrap() // (
.equalTo('type', 1)
.or()
.equalTo('type', 2)
.endWrap() // )
.and()
.greaterThan('price', 100);
等效 SQL:
WHERE (type = 1 OR type = 2) AND price > 100
2. 如何处理 NULL
值?
predicates.isNull('description'); // description IS NULL
predicates.isNotNull('email'); // email IS NOT NULL
3. 如何调试生成的 SQL?
通过 predicates.getWhereClause()
获取实际生成的 WHERE
条件:
console.log(predicates.getWhereClause());
// 输出: "gender = ? AND age >= ? AND name LIKE ?"
总结:RdbPredicates
是鸿蒙关系型数据库的查询条件构建器,通过链式 API 替代原始 SQL 字符串拼接,提供类型安全、可维护性更强的查询方式。开发者应熟练使用其组合条件、动态构建查询等特性,结合索引优化提升数据库性能。