最近在适配一个记账类应用到 HarmonyOS NEXT 平台,重点研究了 HarmonyOS Design 规范下的数据库设计与操作。记录一些关键点供日后参考。
数据库设计部分遵循 HarmonyOS Design 的"简洁高效"原则,设计了三个主要表:
typescript
// 账户表
interface Account {
id: number; // 主键
name: string; // 账户名称
type: number; // 账户类型
balance: number; // 当前余额
createTime: number; // 创建时间戳
}
// 交易记录表
interface Transaction {
id: number; // 主键
accountId: number; // 外键-账户ID
type: number; // 收支类型
amount: number; // 金额
category: string; // 分类
remark?: string; // 备注(可选)
createTime: number; // 创建时间戳
}
// 预算表
interface Budget {
id: number;
category: string; // 分类
amount: number; // 预算金额
cycle: number; // 周期(月/周)
}
复制代码
数据库操作实现使用 HarmonyOS 的 RDB 关系型数据库,API12 版本接口:
1. 初始化数据库
typescript
import relationalStore from '@ohos.data.relationalStore';
const STORE_CONFIG = {
name: 'FinanceDB.db',
securityLevel: relationalStore.SecurityLevel.S1
};
let rdbStore;
relationalStore.getRdbStore(this.context, STORE_CONFIG, (err, store) => {
if (err) {
console.error(`Failed to get RdbStore. Code:${err.code},message:${err.message}`);
return;
}
rdbStore = store;
// 建表
const sql = `CREATE TABLE IF NOT EXISTS account (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
type INTEGER,
balance REAL,
createTime INTEGER)`;
rdbStore.executeSql(sql);
});
复制代码
2. 插入账户数据示例
typescript
async function insertAccount(account: Account) {
const valueBucket = {
'name': account.name,
'type': account.type,
'balance': account.balance,
'createTime': new Date().getTime()
};
try {
await rdbStore.insert('account', valueBucket);
console.info('Succeeded in inserting account.');
} catch (err) {
console.error(`Failed to insert account. Code:${err.code},message:${err.message}`);
}
}
复制代码
3. 复杂查询示例(按月份统计收支)
typescript
async function queryMonthlySummary(year: number, month: number) {
const startTime = new Date(year, month-1, 1).getTime();
const endTime = new Date(year, month, 1).getTime();
const predicates = new relationalStore.RdbPredicates('transaction');
predicates.between('createTime', startTime, endTime);
try {
const result = await rdbStore.query(
predicates,
['type', 'SUM(amount) as total']
);
while (result.goToNextRow()) {
const type = result.getDouble(result.getColumnIndex('type'));
const total = result.getDouble(result.getColumnIndex('total'));
console.info(`Type:${type}, Total:${total}`);
}
result.close();
} catch (err) {
console.error(`Failed to query. Code:${err.code},message:${err.message}`);
}
}
复制代码
注意事项
1. 严格遵循 HarmonyOS Design 的数据安全规范,敏感数据如金额使用 REAL 类型精确存储
2. 事务处理要完整,特别是转账类操作需要保证原子性
3. 考虑使用 Predicates 构建查询条件,比原始 SQL 更安全
4. 大数据量时注意使用异步操作避免阻塞 UI 线程
这次实践让我对 HarmonyOS Design 规范下的数据持久化方案有了更深理解,特别是在数据安全和性能平衡方面的考虑。下一步需要优化数据库索引和考虑分布式数据同步方案。
评论