鸿蒙应用开发--RdbPredicates 是rdb中用于构建数据查询条件的核心工具类,与SQL写法的对比,核心api,高级用法


RdbPredicates 是鸿蒙(HarmonyOS)关系型数据库(Relational Database, RDB)中用于 构建数据查询条件 的核心工具类。它封装了 SQL 查询条件的语法,提供类型安全且链式调用的 API,用于替代直接编写 SQL 语句的 WHERE 子句。


一、核心作用

  1. 数据过滤
    定义 SELECT 操作的筛选规则,如 =>LIKE 等条件。
  2. 排序与分页
    指定结果集的排序方式(升序/降序)和分页参数(偏移量、每页数量)。
  3. 联合查询
    支持多表 JOIN 查询的条件构建(需结合 rdb.rawRdbSet 使用)。
  4. 防 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);

五、最佳实践

  1. 索引优化
    对高频查询字段(如 user_idcreate_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)
      )`;
    
  2. 避免全表扫描

    • 尽量使用 equalTo 替代 like
    • 限制 offset 分页深度(大数据集改用游标分页)
  3. 参数化输入

    // 安全 ✅
    .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 字符串拼接,提供类型安全、可维护性更强的查询方式。开发者应熟练使用其组合条件、动态构建查询等特性,结合索引优化提升数据库性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值