鸿蒙Next如何读取db查询数据
在鸿蒙Next开发中,我想通过数据库查询获取数据,但不太清楚具体实现方法。请问应该如何连接数据库并执行查询操作?能否提供一个简单的代码示例,说明如何读取DB文件、执行SQL语句以及处理返回的结果集?另外,鸿蒙Next对数据库类型是否有特定要求或限制?
2 回复
在鸿蒙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();
关键说明:
- RdbPredicates:用于构建查询条件(WHERE子句)
- query()方法:第二个参数指定返回的列
- ResultSet:需要手动遍历和关闭
- 异常处理:所有数据库操作都需要捕获异常
注意事项:
- 需要在module.json5中申请ohos.permission.DATA权限
- 数据库操作建议在非UI线程执行
- 结果集使用后必须调用close()释放资源
这就是在鸿蒙Next中读取数据库查询数据的基本方法。实际开发中可根据业务需求调整查询条件和数据处理逻辑。


