⚙️ 1. 谓词的核心设计理念
-
链式条件组合:
鸿蒙的RdbPredicates或DataSharePredicates通过条件方法(如equalTo、greaterThan)直接构建查询条件,无需手动编写WHERE。
示例:匹配name为"Rose"的记录let predicates = new relationalStore.RdbPredicates("EMPLOYEE"); predicates.equalTo("name", "Rose"); // 隐式生成 WHERE name = 'Rose' -
条件方法替代
WHERE:
所有条件方法(如like、between)的调用即等价于在 SQL 的WHERE子句中添加条件。
📋 2. 支持的常用谓词方法
以下是鸿蒙谓词的核心方法(对标 SQL 操作):
| 谓词方法 | SQL 等价操作 | 示例代码 | 说明 |
|---|---|---|---|
equalTo(field, value) | field = value | predicates.equalTo("age", 28) | 精确匹配 |
notEqualTo(field, value) | field != value | predicates.notEqualTo("name", "Rose") | 不等于匹配 |
contains(field, value) | field LIKE '%value%' | predicates.contains("title", "Harmony") | 模糊匹配(包含字符串) |
beginsWith(field, value) | field LIKE 'value%' | predicates.beginsWith("path", "/doc") | 匹配开头字符串 |
endsWith(field, value) | field LIKE '%value' | predicates.endsWith("email", "@huawei.com") | 匹配结尾字符串 |
between(field, low, high) | field BETWEEN low AND high | predicates.between("salary", 5000, 10000) | 范围匹配(闭区间) |
greaterThan(field, value) | field > value | predicates.greaterThan("timestamp", 1620000000) | 大于匹配 |
💡 更多方法见官方文档:DataSharePredicates API。
🧩 3. 复杂条件构建(替代 WHERE 组合)
鸿蒙通过 括号包裹 和 逻辑连接符 实现复杂条件:
-
括号分组:
beginWrap()和endWrap()实现条件优先级predicates.equalTo("department", "IT") .beginWrap() // 相当于 ( .equalTo("level", 3) .or() // OR .greaterThan("salary", 15000) .endWrap(); // 相当于 )生成的 SQL:
WHERE department = 'IT' AND (level = 3 OR salary > 15000) -
逻辑运算符:
and():逻辑与(默认条件间即为AND,可省略)or():逻辑或
predicates.equalTo("status", 1).or().equalTo("priority", 5); // 等价于:status = 1 OR priority = 5
🧪 4. 完整示例:查询年龄≥25 且部门为“HR”或“Finance”的员工
import { relationalStore } from '@kit.ArkData';
// 1. 创建谓词对象
let predicates = new relationalStore.RdbPredicates("Employees");
// 2. 构建复杂条件
predicates.greaterThanOrEqualTo("age", 25) // age >= 25
.and()
.beginWrap() // 分组开始
.equalTo("department", "HR")
.or()
.equalTo("department", "Finance")
.endWrap() // 分组结束
.orderByAsc("name"); // 按姓名升序排序
// 3. 执行查询
let resultSet = await rdbStore.query(predicates, ["id", "name", "age"]);
生成的 SQL 逻辑:
SELECT id, name, age FROM Employees
WHERE age >= 25
AND (department = 'HR' OR department = 'Finance')
ORDER BY name ASC;
推荐优先使用 RdbPredicates 的链式条件,兼顾安全性与可读性 ✅。