鸿蒙Next5.0如何读取db数据

在鸿蒙Next5.0系统中,如何读取数据库(db)文件中的数据?具体需要调用哪些API或方法?有没有相关的代码示例可以参考?

2 回复

鸿蒙Next 5.0读取DB数据?简单说就是:用DataAbilityHelperDataAbilityPredicates,像点外卖一样“下单”数据。记得先申请权限,不然数据库会傲娇地拒绝你!代码写错的话,小心数据和你玩捉迷藏哦~

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


在鸿蒙Next 5.0中,读取数据库数据主要通过关系型数据库(RDB) 实现。以下是完整步骤和示例代码:


1. 配置依赖

module.json5中添加权限和依赖:

{
  "module": {
    "requestPermissions": [
      {
        "name": "ohos.permission.DISTRIBUTED_DATASYNC" // 跨设备同步时需声明
      }
    ],
    "dependencies": [
      "@ohos.data.relationalStore" // 关系型数据库模块
    ]
  }
}

2. 初始化数据库

import relationalStore from '@ohos.data.relationalStore';
import { BusinessError } from '@ohos.base';

const TABLE_NAME = 'user';
const SQL_CREATE_TABLE = `CREATE TABLE IF NOT EXISTS ${TABLE_NAME} (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)`;

// 定义数据库配置
const config: relationalStore.StoreConfig = {
  name: 'test.db', // 数据库文件名
  securityLevel: relationalStore.SecurityLevel.S1 // 安全级别
};

let rdbStore: relationalStore.RdbStore | null = null;

// 初始化数据库
async function initDb() {
  try {
    rdbStore = await relationalStore.getRdbStore(globalThis.context, config);
    await rdbStore.executeSql(SQL_CREATE_TABLE); // 建表
    console.info('Database initialized');
  } catch (err) {
    console.error(`Failed to init DB. Code: ${(err as BusinessError).code}`);
  }
}

3. 插入测试数据

async function insertUser(id: number, name: string, age: number) {
  if (!rdbStore) return;
  const valueBucket: relationalStore.ValuesBucket = {
    'id': id,
    'name': name,
    'age': age
  };
  await rdbStore.insert(TABLE_NAME, valueBucket);
}

4. 查询数据

async function queryUsers() {
  if (!rdbStore) return;
  const predicates = new relationalStore.RdbPredicates(TABLE_NAME);
  const columns = ['id', 'name', 'age']; // 要查询的列

  try {
    const resultSet = await rdbStore.query(predicates, columns);
    console.info('ResultSet column names: ' + resultSet.columnNames);
    console.info('ResultSet 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'));
      console.info(`ID: ${id}, Name: ${name}, Age: ${age}`);
    }
    resultSet.close(); // 关闭结果集
  } catch (err) {
    console.error(`Query failed. Code: ${(err as BusinessError).code}`);
  }
}

5. 使用示例

async function demo() {
  await initDb();
  await insertUser(1, '张三', 25);
  await queryUsers();
}

demo();

关键说明:

  1. RdbPredicates:用于构建查询条件(如equalToand等)。
  2. 安全级别:根据数据敏感度选择S1~S4级别。
  3. 数据操作:支持增删改查、事务等完整SQLite功能。

通过以上代码即可在鸿蒙Next 5.0中实现数据库读取操作。注意处理异步异常和结果集资源释放。

回到顶部