Harmony OS个人项目——简单记账APP(5)

继续添加数据库操作

对账目页面的数据保存添加数据持久化,分为了两个,一个支出操作类、一个收入操作类。这里面需要注意的是,需要实现当数据表第一次创建时就需要存入初始数据,所以将插入数据操作放到了查询操作中,通过判断遍历完操作集之后,数组里是否有数据来判断是否插入初始化数据。具体代码如下:

import relationalStore from '@ohos.data.relationalStore'
import classInfo from '../viewmodel/classInfo'

class PayoutModel{

  //支出选项
  payout: classInfo[] = [
    new classInfo('餐饮','餐饮.png'),
    new classInfo('购物','购物.png'),
    new classInfo('日用','日用.png'),
    new classInfo('交通','交通.png'),
    new classInfo('零食','零食.png'),
    new classInfo('运动','运动.png'),
    new classInfo('娱乐','娱乐.png'),
    new classInfo('通讯','通讯.png'),
    new classInfo('服饰','服饰.png'),
    new classInfo('美容','美容.png'),
    new classInfo('住房','住房.png'),
    new classInfo('家庭','家庭.png'),
    new classInfo('社交','社交.png'),
    new classInfo('医疗','医疗.png'),
    new classInfo('学习','学习.png'),
    new classInfo('宠物','宠物.png'),
    new classInfo('礼品','礼品.png'),
    new classInfo('办公','办公.png'),
    new classInfo('维修','维修.png'),
    new classInfo('捐赠','捐赠.png'),
    new classInfo('红包','红包.png'),
    new classInfo('还款','还款.png'),
    new classInfo('借出','借出.png'),
    new classInfo('其它','其它.png')
  ]

  private rdbStore: relationalStore.RdbStore  //私有关系型数据库存储对象
  private tableName: string = 'PAYOUT'   //表名

  //初始化
  initTaskDB(context){
    const config = {
      name: 'MyApplication.db',   //数据库名称
      securityLevel: relationalStore.SecurityLevel.S1   //安全级别
    }

    const sql = `CREATE TABLE IF NOT EXISTS PAYOUT (
                NAME TEXT PRIMARY KEY,
                IMG TEXT,
                MONEY DOUBLE
               )`

    relationalStore.getRdbStore(context,config,(err,rdbStore) => {
      if(err){
        console.log('textTag','获取rdbStore失败!')
        return
      }
      //执行sql语句创建表
      rdbStore.executeSql(sql)
      console.log('textTag','创建payout成功!')
      //将数据库存储对象赋给实例变量
      this.rdbStore = rdbStore
    })
  }

  //查询
  async getTaskList(){
    //创建查询条件对象
    let predicates = new relationalStore.RdbPredicates(this.tableName)
    //执行查询
    let result = await this.rdbStore.query(predicates,['NAME','IMG','MONEY'])

    let payout: classInfo[] = []
    //遍历结果集
    while(!result.isAtLastRow) {
      result.goToNextRow()  //移动到下一行
      let name = result.getString(result.getColumnIndex('NAME'))  //获取名称
      let img = result.getString(result.getColumnIndex('IMG'))   //获取图片
      let money = result.getDouble(result.getColumnIndex('MONEY'))   //获取金额
      //将查询结果添加到数组中
      payout.push({ name, img, money })
    }
    //数据表为空
    if(payout.length === 0){
      for (let i = 0; i < this.payout.length; i++) {
        const name = this.payout[i].name;
        const img = this.payout[i].img;
        const money = 0;
        payout.push({name,img,money})  //存到临时数组中
        this.addTask(name, img, money)  //插入数据到数据表
      }
    }

    console.log('taskTag','查询到数据:',JSON.stringify(payout))
    return payout  //返回查询结果数组
  }

  //添加
  addTask(name: string, img: string, money: number){
    this.rdbStore.insert(this.tableName,{name, img, money})
  }

  //更新
  updateTaskStatus(name: string, money: number){
    //更新的数据对象
    let data = {money}
    //创建更新条件对象
    let predicates = new relationalStore.RdbPredicates(this.tableName)
    //设置更新条件为名称相等
    predicates.equalTo('NAME',name)
    //执行更新操作
    return this.rdbStore.update(data,predicates)
  }

  //删除——未实现(目前未用到)

}
//创建支出模型实例
let payoutModel = new PayoutModel();
//导出支出模型实例作为默认导出
export default payoutModel as PayoutModel

收入数据库操作类与支出大差不差,就不在此展示了。

在addAmount中进行的操作代码:

 aboutToAppear(){
    console.log('testTag','初始化组件,查询任务列表');
    payoutModel.getTaskList()
      .then(payout => {
        this.payout = payout
      })
    incomeModel.getTaskList()
      .then(income => {
        this.income = income
      })
  }

  //对弹出框输入内容和类别进行操作
  handleAddTask(amount: number){
    if(this.showPayoutList){
      this.money -= amount
      payoutModel.updateTaskStatus(this.name,this.money)
        .then(() => {
          console.log('textTag','更新支出统计成功')
        })
      detailedModel.addTask(this.name, this.image, -amount, this.date)
        .then(index => {
          console.log('testTag','处理新增支出明细:')
        })
    } else {
      this.money += amount
      incomeModel.updateTaskStatus(this.name,this.money)
        .then(() => {
          console.log('textTag','更新收入统计成功')
        })
      detailedModel.addTask(this.name, this.image, amount, this.date)
        .then(index => {
          console.log('testTag','处理新增收入明细:')
        })
    }
    this.dialogController.close()
  }

在statistics页面中进行操作的代码:

aboutToAppear(){
    payoutModel.getTaskList()
      .then(payout => {
        this.payout = payout
        console.log('textTag','支出统计加载成功')
      })
    incomeModel.getTaskList()
      .then(income => {
        this.income = income
        console.log('textTag','收入统计加载成功')
      })
  }

但是进行测试的时候,有时候数据添加之后不会马上体现在页面上,会有延迟,猜测是异步处理的问题,但是不知道该怎么解决,决定最后写完所有功能之后再重新考虑这个问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值