鸿蒙应用开发--关系型数据库rdb--待更新

官方文档–关系型数据库

在这里插入图片描述
在这里插入图片描述

1.创建store对象–当前Ability的一个数据库-getRdbStore

在这里插入图片描述

2.数据库中创建表–执行SQL语句-executeSql

在这里插入图片描述

3. 将rdb数据库对象的对象实例保存到全局

在这里插入图片描述

4.插入一条数据–insert方法

因为Id是自动生成的,所以不需要传入.这里id字段传入null就可以了
在这里插入图片描述

5.查询数据-RdbPredicates(表名)

在这里插入图片描述

query方法的参数是predicates类型的对象,所以要先new出来
在这里插入图片描述

在这里插入图片描述

获取的结果集是resultSet.里面有rowcount属性

查询表内所有的数据

在这里插入图片描述

按行查询

在这里插入图片描述
遍历按行查询
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/8403f7ca1eb24bbf86dd98
在这里插入图片描述

上面涉及到类型约束,所以使用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(分布式场景)
  • 路径错误:检查 StoreConfigname 是否合法(避免特殊字符)
2. 查询结果为空
  • 表名/列名拼写错误:SQL 语法严格区分大小写
  • 未提交事务:确保在事务中执行了 commit()
3. 跨设备同步失败
  • 设备未连接:确保设备登录同一华为账号且网络可达
  • 版本兼容性:检查所有设备鸿蒙版本是否支持分布式数据库

通过以上步骤和示例,可系统掌握鸿蒙关系型数据库的开发要点。实际开发时,建议结合官方文档:RDB 开发指南,并善用调试工具验证数据流向。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值