继续添加数据库操作
对账目页面的数据保存添加数据持久化,分为了两个,一个支出操作类、一个收入操作类。这里面需要注意的是,需要实现当数据表第一次创建时就需要存入初始数据,所以将插入数据操作放到了查询操作中,通过判断遍历完操作集之后,数组里是否有数据来判断是否插入初始化数据。具体代码如下:
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','收入统计加载成功')
})
}
但是进行测试的时候,有时候数据添加之后不会马上体现在页面上,会有延迟,猜测是异步处理的问题,但是不知道该怎么解决,决定最后写完所有功能之后再重新考虑这个问题。