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

57 阅读2分钟

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