HarmonyOS关系型数据库操作指南:增删改查实战

前言

在HarmonyOS应用开发中,数据持久化是一个非常重要的环节。关系型数据库(RDB)提供了一种结构化的数据存储方式,非常适合存储需要频繁查询和操作的复杂数据。本文将详细介绍如何在HarmonyOS应用中使用@ohos.data.relationalStore模块进行数据库的增删改查操作。

一、环境准备

首先确保你的DevEco Studio已配置好HarmonyOS开发环境,并在module.json5文件中添加了必要的权限:

json 复制代码
"requestPermissions": [
  {
    "name": "ohos.permission.DISTRIBUTED_DATASYNC"
  }
]

二、数据库初始化

1. 创建数据库和表

我们首先需要初始化数据库并创建表:

typescript 复制代码
const SQL_CREATE_TABLE = `
  CREATE TABLE IF NOT EXISTS EMPLOYEE (
    ID INTEGER PRIMARY KEY AUTOINCREMENT,
    NAME TEXT NOT NULL,
    AGE INTEGER,
    SALARY REAL,
    Codes TEXT
  )`;

private async initRdbStore() {
  try {
    this.rdbStore = await relationalStore.getRdbStore(getContext(), {
      name:'harmonyos.db',
      securityLevel:relationalStore.SecurityLevel.S1
    });
    await this.rdbStore.executeSql(SQL_CREATE_TABLE);
    console.info('Table created successfully');
    this.query(); // 初始数据加载
  } catch (err) {
    console.error(`Database init failed: ${JSON.stringify(err)}`);
  }
}

关键点说明:

  • getRdbStore()方法用于获取或创建数据库
  • SecurityLevel.S1表示数据库安全级别
  • executeSql()用于执行SQL语句创建表

三、CRUD操作实现

1. 插入数据(Create)

javascript 复制代码
async insert() {
  if (!this.rdbStore) return;

  const employee: Employee = {
    id:null,
    name: 'zz',
    age: 18,
    salary: 100.86,
    Codes: '鸿蒙'
  };

  try {
    const rowId = await this.rdbStore.insert("EMPLOYEE", employee);
    console.info(`Insert success, rowId: ${rowId}`);
    employee.id = rowId;
    this.employees = [...this.employees, employee];
  } catch (err) {
    this.handleError(err as BusinessError, 'Insert');
  }
}

2. 查询数据(Read)

typescript 复制代码
async query() {
  if (!this.rdbStore) return;

  const predicates = new relationalStore.RdbPredicates("EMPLOYEE");
  const columns = ["ID", "NAME", "AGE", "SALARY", "Codes"];

  try {
    const resultSet = await this.rdbStore.query(predicates, columns);
    this.processResultSet(resultSet);
  } catch (err) {
    this.handleError(err as BusinessError, 'Query');
  }
}

private processResultSet(resultSet: relationalStore.ResultSet) {
  const temp: Employee[] = [];
  if (resultSet.rowCount > 0) {
    while (resultSet.goToNextRow()) {
      temp.push({
        id: resultSet.getLong(0),
        name: resultSet.getString(1),
        age: resultSet.getLong(2),
        salary: resultSet.getDouble(3),
        Codes: resultSet.getString(4)
      });
    }
  }
  resultSet.close(); // 必须关闭结果集
  this.employees = [...temp];
}

3. 更新数据(Update)

javascript 复制代码
async update() {
  if (!this.rdbStore) return;

  const updateValues : ValuesBucket= {
    Codes: 'Java' // 只更新需要的字段
  };

  const predicates = new relationalStore.RdbPredicates("EMPLOYEE");
  predicates.equalTo('NAME', 'zz');

  try {
    const affectedRows = await this.rdbStore.update(updateValues, predicates);
    console.info(`Updated ${affectedRows} rows`);
    this.query();
  } catch (err) {
    this.handleError(err as BusinessError, 'Update');
  }
}

4. 删除数据(Delete)

javascript 复制代码
async remove() {
  if (!this.rdbStore) return;

  const predicates = new relationalStore.RdbPredicates("EMPLOYEE");
  predicates.equalTo("ID", 2); // 删除ID为2的记录

  try {
    const affectedRows = await this.rdbStore.delete(predicates);
    console.info(`Deleted ${affectedRows} rows`);
    this.query(); // 删除后刷新
  } catch (err) {
    this.handleError(err as BusinessError, 'Delete');
  }
}

四、UI界面实现

我们使用ArkUI构建了一个简单的界面来展示操作按钮和数据表格:

scss 复制代码
@Builder
buildActionButtons() {
  Row() {
    Button('添加')
      .onClick(() => this.insert())
      .type(ButtonType.Capsule)

    Button('删除')
      .onClick(() => this.remove())
      .type(ButtonType.Capsule)
      .margin({ left: 10 })

    Button('修改')
      .onClick(() => this.update())
      .type(ButtonType.Capsule)
      .margin({ left: 10 })

    Button('查看')
      .onClick(() => this.query())
      .type(ButtonType.Capsule)
      .margin({ left: 10 })
  }
  .justifyContent(FlexAlign.Center)
  .margin({ bottom: 20 })
}

@Builder
buildDataTable() {
  Column() {
    // 表头
    this.buildTableHeader()

    // 数据行
    List({ space: 8 }) {
      ForEach(this.employees, (item: Employee) => {
        ListItem() {
          this.buildTableRow(item)
        }
      }, (item: Employee) => item.id?.toString() ?? '')
    }
    .layoutWeight(1)
    .divider({ strokeWidth: 1, color: Color.Gray })
  }
  .borderRadius(8)
  .border({ width: 1, color: Color.Gray })
  .padding(8)
}

五、总结

本文详细介绍了HarmonyOS关系型数据库的CRUD操作,包括:

  • 数据库和表的创建
  • 数据的插入、查询、更新和删除
  • 使用RdbPredicates构建查询条件
  • 结果集的遍历和处理
  • 完整的UI实现

通过这个示例,你可以快速掌握HarmonyOS中关系型数据库的基本操作,为开发数据驱动的应用打下坚实基础。

相关推荐
2601_949593654 小时前
基础入门 React Native 鸿蒙跨平台开发:模拟智能音响
react native·react.js·harmonyos
xiaoqi9225 小时前
React Native鸿蒙跨平台如何进行狗狗领养中心,实现基于唯一标识的事件透传方式是移动端列表开发的通用规范
javascript·react native·react.js·ecmascript·harmonyos
jin1233225 小时前
React Native鸿蒙跨平台剧本杀组队消息与快捷入口组件,包含消息列表展示、快捷入口管理、快捷操作触发和消息详情预览四大核心功能
javascript·react native·react.js·ecmascript·harmonyos
烬头88217 小时前
React Native鸿蒙跨平台实现二维码联系人APP(QRCodeContactApp)
javascript·react native·react.js·ecmascript·harmonyos
xiaoqi9229 小时前
React Native鸿蒙跨平台如何实现分类页面组件通过searchQuery状态变量管理搜索输入,实现了分类的实时过滤功能
javascript·react native·react.js·ecmascript·harmonyos
听麟9 小时前
HarmonyOS 6.0+ 智慧出行导航APP开发实战:离线地图与多设备位置协同落地
华为·wpf·harmonyos
qq_177767379 小时前
React Native鸿蒙跨平台实现应用介绍页,实现了应用信息卡片展示、特色功能网格布局、权限/联系信息陈列、评分展示、模态框详情交互等通用场景
javascript·react native·react.js·ecmascript·交互·harmonyos
jin12332211 小时前
基于React Native鸿蒙跨平台地址管理是许多电商、外卖、物流等应用的重要功能模块,实现了地址的添加、编辑、删除和设置默认等功能
javascript·react native·react.js·ecmascript·harmonyos
2501_9209317011 小时前
React Native鸿蒙跨平台医疗健康类的血压记录,包括收缩压、舒张压、心率、日期、时间、备注和状态
javascript·react native·react.js·ecmascript·harmonyos
2501_9209317012 小时前
React Native鸿蒙跨平台使用useState管理健康记录和过滤状态,支持多种健康数据类型(血压、体重等)并实现按类型过滤功能
javascript·react native·react.js·ecmascript·harmonyos