学习内容:
观看黑马视频完成数据模型-饮食记录和通用DB工具
学习时间:
2024年6月21日
学习产出:
一.根据页面设计数据模型
1.记录类型
export default class RecordType{
/**
* 类型id
*/
id: number
/**
* 类型名称
*/
name: ResourceStr
/**
* 类型图标
*/
icon: ResourceStr
/**
* 类型推荐最小卡路里
*/
min: number
/**
* 类型推荐最大卡路里
*/
max: number
constructor(id: number, name: ResourceStr, icon: ResourceStr, min: number = 0, max: number = 0) {
this.id = id
this.name = name
this.icon = icon
this.min = min
this.max = max
}
}
2.记录模型本身:
import RecordItem from './RecordItem'
/**
* 饮食记录的页面数据模型
*/
export default class RecordVO {
/**
* 记录id
*/
id: number
/**
* 饮食记录类型
*/
typeId: number
/**
* 卡路里总数
*/
calorie: number
/**
* 记录中的食物或运动信息
*/
recordItem: RecordItem
/**
* 食物数量或运动时长,如果是运动信息则无
*/
amount: number = 0
}
引用数据模型
在RecordModel中,创建数据库的表,
(1)将需要的信息存入数据库,新建数据持久化的类 RecordPO用来记录数据表的信息,
(2)在RecordModel中,创建表
二.饮食记录数据操作Model的开发
增删改查操作:
1.由于数据表的字段信息与对象的信息不一致,无法进行数据库操作,所以新建类ColumnInfo
export interface ColumnInfo{
name: string
columnName: string
type: ColumnType
}
在recordModel中将影射写出
const COLUMNS: ColumnInfo[] = [
{name: 'id', columnName: 'id', type: ColumnType.LONG},
{name: 'typeId', columnName: 'type_id', type: ColumnType.LONG},
{name: 'itemId', columnName: 'item_id', type: ColumnType.LONG},
{name: 'amount', columnName: 'amount', type: ColumnType.DOUBLE},
{name: 'createTime', columnName: 'create_time', type: ColumnType.LONG}
]
2.新增
insert(tableName: string, obj: any, columns: ColumnInfo[]){
//返回为异步方法
return new Promise((resolve, reject) => {
// 1.构建新增数据,将对象obj转为value
let value = this.buildValueBucket(obj, columns)
// 2.新增
this.rdbStore.insert(tableName, value, (err, id) => {
//有异常
if (err) {
Logger.error('新增失败!', JSON.stringify(err))
reject(err)
} else {
Logger.debug('新增成功!新增id:', id.toString())
resolve(id)
}
})
})
}
3.删除
delete(predicates: relationalStore.RdbPredicates){
return new Promise((resolve, reject) => {
this.rdbStore.delete(predicates, (err, rows) => {
if (err) {
Logger.error('删除失败!', JSON.stringify(err))
reject(err)
} else {
Logger.debug('删除成功!删除行数:', rows.toString())
resolve(rows)
}
})
})
}
4.查询
因为最后结果返回的是resultset,必须经过解析才能转成所需的字段
queryForList(predicates: relationalStore.RdbPredicates, columns: ColumnInfo[]) {
return new Promise((resolve, reject) => {
this.rdbStore.query(predicates, columns.map(info => info.columnName), (err, result) => {
if (err) {
Logger.error('查询失败!', JSON.stringify(err))
reject(err)
} else {
Logger.debug('查询成功!查询行数:', result.rowCount.toString())
resolve(result)
}
})
})
}
进行解析:
parseResultSet(result: relationalStore.ResultSet, columns: ColumnInfo[]) {
// 1.声明最终返回的结果
let arr = []
// 2.判断是否有结果
if (result.rowCount <= 0) {
return arr
}
// 3.处理结果
///是否为最后一行
while (!result.isAtLastRow) {
// 3.1.去下一行
result.goToNextRow()
// 3.2.解析这行数据,转为对象
let obj = {}
columns.forEach(info => {
let val = null
//根据类型确定取的方法
switch (info.type) {
case ColumnType.LONG:
val = result.getLong(result.getColumnIndex(info.columnName))
break
case ColumnType.DOUBLE:
val = result.getDouble(result.getColumnIndex(info.columnName))
break
case ColumnType.STRING:
val = result.getString(result.getColumnIndex(info.columnName))
break
case ColumnType.BLOB:
val = result.getBlob(result.getColumnIndex(info.columnName))
break
}
obj[info.name] = val
})
// 3.3.将对象填入结果数组
arr.push(obj)
}
return arr
}
三.在RecordModel中调用增删查的操作
insert(record: RecordPO){
return DbUtil.insert(TABLE_NAME, record, COLUMNS)
}
deleteById(id: number){
// 1.删除条件
let predicates = new relationalStore.RdbPredicates(TABLE_NAME)
predicates.equalTo(ID_COLUMN, id)
// 2.删除
return DbUtil.delete(predicates)
}
listByDate(date: number){
// 1.查询条件
let predicates = new relationalStore.RdbPredicates(TABLE_NAME)
predicates.equalTo(DATE_COLUMN, date)
// 2.查询
return DbUtil.queryForList(predicates, COLUMNS)
}
问题:
entryability中导入不进recordModel
将其改为ets文件
注:Model中的枚举项与数组下标一致