HarmonyOS NEXT 中级开发笔记:基于HarmonyOS Design的记账应用数据库实践

HarmonyOS NEXT记账应用数据库实践

最近在适配一个记账类应用到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);
});
  1. 插入账户数据示例

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}`);
  }
}
  1. 复杂查询示例(按月份统计收支)

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值