鸿蒙开始之数据库封装

发布于:2025-06-29 ⋅ 阅读:(23) ⋅ 点赞:(0)

在鸿蒙(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

  • 支持依赖注入

三、数据库封装实现方案

  1. 基础封装类设计
// 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)...
}
  1. 实体类与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思想。
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到