在鸿蒙(HarmonyOS)应用开发中,数据库封装是提升开发效率、降低维护成本的重要实践。鸿蒙提供了轻量级的关系型数据库能力(如@ohos.data.rdb),通过封装可以简化数据库操作、统一错误处理、增强数据安全性。以下是鸿蒙数据库封装的关键要点和实现方案。
一、鸿蒙数据库基础
鸿蒙的轻量级数据库(RDB)基于SQLite,支持基本的CRUD操作和事务管理。核心API包括:
RdbStore:数据库连接对象
ValuesBucket:数据容器(类似Android的ContentValues)
ResultSet:查询结果集
示例:直接使用RDB API
import rdb from '@ohos.data.rdb';
// 1. 创建数据库
const storeConfig = {
name: 'test.db',
securityLevel: rdb.SecurityLevel.S1
};
const store = await rdb.getRdbStore(context, storeConfig, 1);
// 2. 创建表
const sql = 'CREATE TABLE IF NOT EXISTS User (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)';
await store.executeSql(sql);
// 3. 插入数据
const valuesBucket = new rdb.ValuesBucket();
valuesBucket.putString('name', 'Alice');
valuesBucket.putInteger('age', 25);
await store.insert('User', valuesBucket);
二、数据库封装的必要性
直接使用RDB API存在以下问题:
代码冗余:重复的错误处理、表名硬编码
维护困难:SQL语句分散,难以统一修改
安全风险:直接拼接SQL易引发注入攻击
测试复杂:依赖真实数据库环境
封装目标:
统一错误处理
集中管理SQL语句
提供类型安全的API
支持依赖注入
三、数据库封装实现方案
- 基础封装类设计
// database/DbHelper.ets
import rdb from '@ohos.data.rdb';
export class DbHelper {
private store: rdb.RdbStore;
constructor(context: Context, config: rdb.RdbStoreConfig) {
this.store = rdb.getRdbStore(context, config, 1).catch(err => {
console.error('Database initialization failed:', err);
throw err;
});
}
// 通用查询方法
async query<T>(
table: string,
columns: string[],
predicate?: rdb.RdbPredicates,
mapper?: (resultSet: rdb.ResultSet) => T
): Promise<T[]> {
try {
const resultSet = await this.store.query(predicate || rdb.RdbPredicates.ALL, columns);
const result: T[] = [];
while (await resultSet.goToNextRow()) {
result.push(mapper ? mapper(resultSet) : this.mapRow<T>(resultSet));
}
await resultSet.close();
return result;
} catch (err) {
console.error('Query failed:', err);
throw err;
}
}
// 映射行数据(需子类实现)
protected mapRow<T>(resultSet: rdb.ResultSet): T {
throw new Error('Not implemented');
}
// 其他通用方法(insert/update/delete)...
}
- 实体类与Repository模式
// entities/User.ets
export class User {
id?: number;
name: string;
age: number;
}
// repositories/UserRepository.ets
import { DbHelper } from '../database/DbHelper';
import { User } from '../entities/User';
export class UserRepository extends DbHelper {
constructor(context: Context) {
super(context, {
name: 'app.db',
securityLevel: rdb.SecurityLevel.S1
});
this.initTable();
}
private async initTable() {
await this.store.executeSql('CREATE TABLE IF NOT EXISTS User (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER)');
}
async addUser(user: User): Promise<number> {
const values = new rdb.ValuesBucket();
values.putString('name', user.name);
values.putInteger('age', user.age);
return await this.store.insert('User', values);
}
async getUsers(): Promise<User[]> {
return await this.query<User>(
'User',
['id', 'name', 'age'],
undefined,
(rs) => ({
id: rs.getLong(rs.getColumnIndex('id')),
name: rs.getString(rs.getColumnIndex('name')),
age: rs.getInteger(rs.getColumnIndex('age'))
})
);
}
}
鸿蒙数据库封装的核心在于:
抽象:将底层API封装为业务友好的接口
复用:提取公共逻辑(如错误处理、事务管理)
安全:通过参数化查询防止注入
可测:提供清晰的测试边界
通过合理的封装,可以显著提升鸿蒙应用的数据层开发效率和质量。建议根据项目规模选择合适的封装粒度,小型项目可简单封装,大型项目建议采用Repository模式+ORM思想。