官方文档–关系型数据库
1.创建store对象–当前Ability的一个数据库-getRdbStore
2.数据库中创建表–执行SQL语句-executeSql
3. 将rdb数据库对象的对象实例保存到全局
4.插入一条数据–insert方法
因为Id是自动生成的,所以不需要传入.这里id字段传入null就可以了
5.查询数据-RdbPredicates(表名)
query方法的参数是predicates类型的对象,所以要先new出来
获取的结果集是resultSet.里面有rowcount属性
查询表内所有的数据
按行查询
遍历按行查询
上面涉及到类型约束
,所以使用JSON序列化valuesBucket对象
,然后反序列化类型断言为我们需要的数据类型
删除数据
查看数据库存储地方
对于模拟机,存储在deviceFileBrowser=>data=>app=>el2=>100=>databaser=>找到自己的应用bundlename
在鸿蒙(HarmonyOS)开发中,关系型数据库(RDB) 是实现本地结构化数据存储的核心模块,其基于 SQLite 封装,提供更符合鸿蒙生态的 API。以下是 从零入门到掌握 RDB 的完整指南,包含关键步骤和代码示例:
一、RDB 核心概念
1. 核心组件
组件 | 作用 |
---|---|
RdbStore | 数据库实例,提供增删改查(CRUD)操作的入口 |
StoreConfig | 数据库配置(名称、存储模式、加密密钥等) |
ResultSet | 查询结果集,用于遍历数据 |
ValuesBucket | 键值对容器,用于插入或更新数据(类似 Android 的 ContentValues) |
2. 数据存储模式
模式 | 特点 |
---|---|
单设备模式 | 数据仅存储在当前设备(默认) |
分布式模式 | 数据可跨设备同步(需结合分布式能力) |
二、快速入门:四步实现数据操作
步骤 1:配置数据库依赖
在 module.json5
中添加依赖:
{
"module": {
"requestPermissions": [
{
"name": "ohos.permission.DISTRIBUTED_DATASYNC", // 分布式同步权限(可选)
"reason": "需要跨设备同步数据"
}
],
"abilities": [
{
"name": ".MyDatabaseHelper",
"type": "service" // 推荐使用 Service Ability 管理数据库
}
]
}
}
步骤 2:创建数据库与表结构
import relationalStore from '@ohos.data.relationalStore';
import Ability from '@ohos.app.ability.ServiceAbility';
class MyDatabaseHelper extends Ability {
private rdbStore: relationalStore.RdbStore | null = null;
async onCreate() {
// 配置数据库
const config: relationalStore.StoreConfig = {
name: 'my_database.db',
securityLevel: relationalStore.SecurityLevel.S1 // 安全级别
};
// SQL 建表语句
const createTableSql = `
CREATE TABLE IF NOT EXISTS users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
age INTEGER,
created_time TIMESTAMP DEFAULT (datetime('now','localtime'))
)`;
// 初始化数据库
try {
this.rdbStore = await relationalStore.getRdbStore(this.context, config);
await this.rdbStore.executeSql(createTableSql);
console.log('数据库初始化成功');
} catch (err) {
console.error('初始化失败:', err.code, err.message);
}
}
}
步骤 3:实现增删改查(CRUD)
// 插入数据
async insertUser(name: string, age: number) {
if (!this.rdbStore) return;
const values: relationalStore.ValuesBucket = {
name: name,
age: age
};
try {
const rowId = await this.rdbStore.insert('users', values);
console.log('插入成功,ID:', rowId);
} catch (err) {
console.error('插入失败:', err);
}
}
// 查询数据
async queryUsers() {
if (!this.rdbStore) return;
const columns = ['id', 'name', 'age'];
const predicates = new relationalStore.RdbPredicates('users');
predicates.orderByAsc('age'); // 按年龄升序排序
try {
const resultSet = await this.rdbStore.query(predicates, columns);
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.log(`用户信息: ID=${id}, 姓名=${name}, 年龄=${age}`);
}
resultSet.close();
} catch (err) {
console.error('查询失败:', err);
}
}
// 更新数据
async updateUserAge(id: number, newAge: number) {
if (!this.rdbStore) return;
const values: relationalStore.ValuesBucket = { age: newAge };
const predicates = new relationalStore.RdbPredicates('users');
predicates.equalTo('id', id);
try {
const rowsUpdated = await this.rdbStore.update(values, predicates);
console.log('更新行数:', rowsUpdated);
} catch (err) {
console.error('更新失败:', err);
}
}
// 删除数据
async deleteUser(id: number) {
if (!this.rdbStore) return;
const predicates = new relationalStore.RdbPredicates('users');
predicates.equalTo('id', id);
try {
const rowsDeleted = await this.rdbStore.delete(predicates);
console.log('删除行数:', rowsDeleted);
} catch (err) {
console.error('删除失败:', err);
}
}
步骤 4:事务处理
async transactionalOperation() {
if (!this.rdbStore) return;
await this.rdbStore.beginTransaction();
try {
await this.insertUser('Alice', 30);
await this.updateUserAge(1, 31);
await this.rdbStore.commit();
console.log('事务提交成功');
} catch (err) {
await this.rdbStore.rollback();
console.error('事务回滚:', err);
}
}
三、高级功能
1. 数据变化观察者
class UserDataObserver implements relationalStore.DataObserver {
onStoreChange(storeName: string, eventType: relationalStore.ChangeEventType) {
console.log(`数据库 ${storeName} 发生变化,事件类型: ${eventType}`);
// 刷新 UI 或同步数据
}
}
// 注册观察者
const observer = new UserDataObserver();
this.rdbStore?.registerDataObserver('users', observer);
// 取消注册
this.rdbStore?.unregisterDataObserver(observer);
2. 分布式数据同步
// 配置分布式数据库
const config: relationalStore.StoreConfig = {
name: 'sync_database.db',
distributed: true // 启用分布式
};
// 获取同步设备列表
const devices = await this.rdbStore?.getDistributedDevices();
console.log('可同步设备:', devices);
// 手动触发同步
await this.rdbStore?.sync({
devices: ['device1', 'device2'],
mode: relationalStore.SyncMode.SYNC_MODE_PUSH
});
四、调试与优化
1. 数据库文件导出
通过 hdc
工具获取数据库文件:
hdc file recv /data/app/el2/100/database/<your_app_id>/my_database.db ./local_path.db
2. 使用 SQLite 工具
用 DB Browser for SQLite 打开导出的 .db
文件,直观查看表结构和数据。
3. 性能优化建议
- 索引优化:为频繁查询的字段添加索引
CREATE INDEX idx_users_age ON users(age);
- 批量操作:使用事务处理批量插入/更新
- 避免全表查询:通过
RdbPredicates
精确筛选条件
五、常见问题解决
1. 数据库无法创建
- 权限不足:确认已申请
ohos.permission.DISTRIBUTED_DATASYNC
(分布式场景) - 路径错误:检查
StoreConfig
的name
是否合法(避免特殊字符)
2. 查询结果为空
- 表名/列名拼写错误:SQL 语法严格区分大小写
- 未提交事务:确保在事务中执行了
commit()
3. 跨设备同步失败
- 设备未连接:确保设备登录同一华为账号且网络可达
- 版本兼容性:检查所有设备鸿蒙版本是否支持分布式数据库
通过以上步骤和示例,可系统掌握鸿蒙关系型数据库的开发要点。实际开发时,建议结合官方文档:RDB 开发指南,并善用调试工具验证数据流向。