本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新
在鸿蒙(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}`);
});
四、建议
-
安全加密
- 敏感数据启用
encrypt: true
(KVStore)或使用SQLite加密扩展。
kvManager.getKVStore('secure_data', { encrypt: true });
- 敏感数据启用
-
性能优化
- 批量操作使用事务:
rdbStore.beginTransaction(); // 批量插入/更新... rdbStore.commit();
- 批量操作使用事务:
-
跨设备同步
- 分布式KVStore自动同步同账号设备数据:
kvManager.getKVStore('sync_store', { kvStoreType: distributedKVStore.KVStoreType.DEVICE_COLLABORATION });
- 分布式KVStore自动同步同账号设备数据:
-
数据迁移
- 版本升级时通过
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前定位到首行 |
跨设备同步失败 | 未登录华为账号 | 检查设备账号一致性 |