最近在适配一个记账类应用到 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 规范下的数据持久化方案有了更深理解,特别是在数据安全和性能平衡方面的考虑。下一步需要优化数据库索引和考虑分布式数据同步方案。
评论