鸿蒙Next如何读取db查询数据

在鸿蒙Next开发中,我想通过数据库查询获取数据,但不太清楚具体实现方法。请问应该如何连接数据库并执行查询操作?能否提供一个简单的代码示例,说明如何读取DB文件、执行SQL语句以及处理返回的结果集?另外,鸿蒙Next对数据库类型是否有特定要求或限制?

2 回复

鸿蒙Next读取DB数据?简单!用RdbStorequery方法,配上SQL语句,数据就到碗里来了。记得先打开数据库,不然只能对着空气查表!😄

更多关于鸿蒙Next如何读取db查询数据的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在鸿蒙Next(HarmonyOS NEXT)中,读取数据库查询数据主要通过关系型数据库(RDB)实现。以下是详细步骤和示例代码:

1. 创建数据库和表

首先定义数据模型并初始化数据库:

import relationalStore from '@ohos.data.relationalStore';

// 定义表结构
const SQL_CREATE_TABLE = `
  CREATE TABLE IF NOT EXISTS user (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    age INTEGER
  )`

// 初始化数据库
const STORE_CONFIG = {
  name: 'test.db',
  securityLevel: relationalStore.SecurityLevel.S1
}

let rdbStore: relationalStore.RdbStore | null = null;

async function initDb() {
  try {
    rdbStore = await relationalStore.getRdbStore(globalThis.context, STORE_CONFIG);
    await rdbStore.executeSql(SQL_CREATE_TABLE);
    console.info('Database initialized');
  } catch (err) {
    console.error(`Failed to init database, code: ${err.code}, message: ${err.message}`);
  }
}

2. 插入测试数据

async function insertUser(name: string, age: number) {
  if (!rdbStore) return;
  
  const valueBucket = {
    'name': name,
    'age': age
  };
  
  try {
    await rdbStore.insert('user', valueBucket);
    console.info('Insert success');
  } catch (err) {
    console.error(`Failed to insert, code: ${err.code}, message: ${err.message}`);
  }
}

3. 查询数据

使用谓词(Predicates)构建查询条件:

import relationalStore from '@ohos.data.relationalStore';

async function queryUsers() {
  if (!rdbStore) return;
  
  try {
    // 构建查询条件(查询年龄大于18的用户)
    const predicates = new relationalStore.RdbPredicates('user');
    predicates.greaterThan('age', 18);
    
    // 执行查询
    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'));
      const age = resultSet.getLong(resultSet.getColumnIndex('age'));
      console.info(`User: id=${id}, name=${name}, age=${age}`);
    }
    
    resultSet.close(); // 关闭结果集
  } catch (err) {
    console.error(`Failed to query, code: ${err.code}, message: ${err.message}`);
  }
}

4. 完整调用示例

async function demo() {
  await initDb();
  await insertUser('张三', 20);
  await insertUser('李四', 17);
  await queryUsers(); // 只会查询到张三的记录
}

demo();

关键说明:

  1. RdbPredicates:用于构建查询条件(WHERE子句)
  2. query()方法:第二个参数指定返回的列
  3. ResultSet:需要手动遍历和关闭
  4. 异常处理:所有数据库操作都需要捕获异常

注意事项:

  • 需要在module.json5中申请ohos.permission.DATA权限
  • 数据库操作建议在非UI线程执行
  • 结果集使用后必须调用close()释放资源

这就是在鸿蒙Next中读取数据库查询数据的基本方法。实际开发中可根据业务需求调整查询条件和数据处理逻辑。

回到顶部