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


bianchengyishu
1 声望0 粉丝