鸿蒙开发中 数据库的种类

本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新

在鸿蒙(HarmonyOS)开发中,实现页面数据的持久化存储主要通过 关系型数据库(RDB)对象关系映射(ORM)轻量级键值数据库(KVStore) 三种方式。

一、关系型数据库(RDB)

适用于结构化数据(如用户信息、订单记录),支持SQL语法。

1. 核心API
API作用
relationalStore数据库管理模块
RdbPredicates构建查询条件
ResultSet存储查询结果
2. 实现步骤
1. 创建数据库与表
import relationalStore from '@ohos.data.relationalStore';

// 定义表结构
const SQL_CREATE_TABLE = `
  CREATE TABLE IF NOT EXISTS user (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL,
    age INTEGER,
    email TEXT UNIQUE
  )`;

// 初始化数据库
let rdbStore: relationalStore.RdbStore;
const STORE_CONFIG = {
  name: 'myApp.db', // 数据库名
  securityLevel: relationalStore.SecurityLevel.S1 // 安全级别
};

relationalStore.getRdbStore(getContext(this), STORE_CONFIG, (err, store) => {
  rdbStore = store;
  rdbStore.executeSql(SQL_CREATE_TABLE); // 建表
});
2. 增删改查操作
// 插入数据
const user = { name: '张三', age: 25, email: 'zhangsan@example.com' };
rdbStore.insert('user', user, (err, rowId) => {
  if (!err) console.info(`插入成功,ID: ${rowId}`);
});

// 查询数据
let predicates = new relationalStore.RdbPredicates('user');
predicates.equalTo('name', '张三');
rdbStore.query(predicates, ['id', 'name', 'age'], (err, resultSet) => {
  if (resultSet.rowCount > 0) {
    resultSet.goToFirstRow();
    console.info(`查询结果: ${resultSet.getString(resultSet.getColumnIndex('name'))}`);
  }
  resultSet.close(); // 必须关闭ResultSet
});

// 更新数据
let updatePredicates = new relationalStore.RdbPredicates('user');
updatePredicates.equalTo('id', 1);
rdbStore.update({ age: 26 }, updatePredicates, (err) => {
  if (!err) console.info('更新成功');
});

// 删除数据
let deletePredicates = new relationalStore.RdbPredicates('user');
deletePredicates.equalTo('id', 1);
rdbStore.delete(deletePredicates, (err) => {
  if (!err) console.info('删除成功');
});

二、轻量级键值数据库(KVStore)

适用于简单配置或非结构化数据(如用户偏好)。

1. 核心API
API作用
distributedKVStore管理KV数据库
put/get/delete数据操作接口
2. 实现步骤
1. 初始化KVStore
import distributedKVStore from '@ohos.distributedKVStore';

let kvManager: distributedKVStore.KVManager;
let kvStore: distributedKVStore.SingleKVStore;

// 创建管理器
kvManager = distributedKVStore.createKVManager({
  bundleName: 'com.example.myapp',
  context: getContext(this)
});

// 获取KVStore
kvManager.getKVStore('user_prefs', { 
  createIfMissing: true, // 不存在时自动创建
  encrypt: false,        // 不加密
  backup: false,         // 不备份
  kvStoreType: distributedKVStore.KVStoreType.SINGLE_VERSION
}, (err, store) => {
  kvStore = store;
});
2. 数据操作
// 写入数据
kvStore.put('theme', 'dark', (err) => {
  if (!err) console.info('主题已保存');
});

// 读取数据
kvStore.get('theme', (err, value) => {
  console.info(`当前主题: ${value}`);
});

// 删除数据
kvStore.delete('theme', (err) => {
  if (!err) console.info('主题已重置');
});

三、对象关系映射(ORM)

通过 @ohos.data.orm 简化数据库操作,适合复杂业务模型。

1. 定义实体类
import { Entity, Column, PrimaryKey } from '@ohos.data.orm';

@Entity('user') // 表名
class User {
  @PrimaryKey() // 主键
  id: number;

  @Column({ type: 'text', nullable: false }) // 非空文本
  name: string;

  @Column({ type: 'integer' }) // 整数
  age: number;
}
2. 操作数据库
import { OrmContext } from '@ohos.data.orm';

// 初始化ORM
let ormContext: OrmContext;
OrmContext.initialize(getContext(this), 'myApp.db', (err, context) => {
  ormContext = context;
});

// 插入数据
let user = new User();
user.name = '李四';
user.age = 30;
ormContext.insert(user, (err) => {
  if (!err) console.info('插入成功');
});

// 查询数据
let predicates = ormContext.createPredicates(User);
predicates.equalTo('name', '李四');
ormContext.query(predicates, (err, results) => {
  console.info(`查询结果: ${results[0].name}`);
});

四、建议

  1. 安全加密

    • 敏感数据启用 encrypt: true(KVStore)或使用SQLite加密扩展。
    kvManager.getKVStore('secure_data', { encrypt: true });
  2. 性能优化

    • 批量操作使用事务:
      rdbStore.beginTransaction();
      // 批量插入/更新...
      rdbStore.commit();
  3. 跨设备同步

    • 分布式KVStore自动同步同账号设备数据:
      kvManager.getKVStore('sync_store', { kvStoreType: distributedKVStore.KVStoreType.DEVICE_COLLABORATION });
  4. 数据迁移

    • 版本升级时通过 onUpgrade 处理表结构变更:
      relationalStore.getRdbStore(getContext(this), { 
        name: 'myApp.db',
        version: 2, // 新版本号
        onUpgrade: (store, oldVersion, newVersion) => {
          store.executeSql('ALTER TABLE user ADD COLUMN phone TEXT');
        }
      });

五、流程图

六、常见问题

问题原因解决方案
数据库无法创建路径权限不足检查getContext()是否正确
查询结果为空未调用goToFirstRow()确保操作ResultSet前定位到首行
跨设备同步失败未登录华为账号检查设备账号一致性

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值