数据模型
记录项
我们把饮食和运动,定义到一个模型里,从单元开始,建立数据模型,用于显示食物和运动,食物和运动用到一个数据模型,根据数据类型里用于区分的参数实现显示不同的页面效果。
饮食记录
数据模型通用DB工具
通用DB工具都可以用,可以简化我们对关系数据库的增删改查
定义数据模型
// 记录的数据
// 注意和数据库字段名字不一样,所以还需要定义一个,数据库字段和数据记录数据相对应的类ColumnInfo
export default class RecordPO{
/**
* 记录id
*/
id?: number
/**
* 饮食记录类型
*/
typeId: number
/**
* 记录中的食物或运动信息
*/
itemId: number
/**
* 食物数量或运动时长,如果是运动信息则无
*/
amount: number
/**
* 记录的日期
*/
createTime: number
}
export class ColumnInfo{
name: string
columnName: string
type: ColumnType
}
export enum ColumnType{
LONG,
DOUBLE,
STRING,
BLOB
}
工具类
import common from '@ohos.app.ability.common'; // 系统工具
import relationalStore from '@ohos.data.relationalStore'; // 系统数据库
import { ColumnInfo, ColumnType } from '../bean/ColumnInfo';
import Logger from './Logger'; // 自定义打印类
const DB_FILENAME: string = 'HealthyApp.db'
class DbUtil {
rdbStore: relationalStore.RdbStore
initDB(context: common.UIAbilityContext): Promise<void> {
let config: relationalStore.StoreConfig = {
name: DB_FILENAME,
securityLevel: relationalStore.SecurityLevel.S1
}
return new Promise<void>((resolve, reject) => {
relationalStore.getRdbStore(context, config)
.then(rdbStore => {
this.rdbStore = rdbStore
Logger.debug('rdbStore 初始化完成!')
resolve()
})
.catch(reason => {
Logger.debug('rdbStore 初始化异常', JSON.stringify(reason))
reject(reason)
})
})
}
createTable(createSQL: string): Promise<void> {
return new Promise((resolve, reject) => {
this.rdbStore.executeSql(createSQL)
.then(() => {
Logger.debug('创建表成功', createSQL)
resolve()
})
.catch(err => {
Logger.error('创建表失败,' + err.message, JSON.stringify(err))
reject(err)
})
})
}
// obj是匿名对象{id: 12, name:zs,age: 18}
insert(tableName: string, obj: any, columns: ColumnInfo[]): Promise<number> {
return new Promise((resolve, reject) => {
// 1.构建新增数据
let value = this.buildValueBucket(obj, columns)
this.rdbStore.insert(tableName, value, (err, id) => {
if (err) {
Logger.error('新增失败!', JSON.stringify(err))
reject(err)
}else {
Logger.debug('新增成功!新增id:', id.toString())
resolve(id)
}
})
})
}
delete(predicates: relationalStore.RdbPredicates): Promise<number> {
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)
}
})
})
}
// columns 把你要查询的字段告诉我
// 以后调用的时候知道类型
queryForList<T>(predicates: relationalStore.RdbPredicates, columns: ColumnInfo[]): Promise<T[]> {
return new Promise((resolve, reject) => {
this.rdbStore.query(predicates, columns.map(info => info.columnName), (err, result) => { // map将对象里的属性映射成数组
if (err) {
Logger.error('查询失败!', JSON.stringify(err))
reject(err)
} else {
Logger.debug('查询成功!查询行数:', result.rowCount.toString())
resolve(this.parseResultSet(result, columns)) // 由于查询结果是一个ResultSet,我们解析成数组,以后调用的时候方便
}
})
})
}
// 解析函数
parseResultSet<T>(result: relationalStore.ResultSet, columns: ColumnInfo[]){
// 1.声明最终返回的结果
let arr = []
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: // 如果是LONG
val = result.getLong(result.getColumnIndex(info.columnName))
break
case ColumnType.DOUBLE: // 如果是DOUBLE
val = result.getDouble(result.getColumnIndex(info.columnName))
break
case ColumnType.STRING: // 如果是STRING
val = result.getString(result.getColumnIndex(info.columnName))
break
case ColumnType.BLOB: // 如果是BLOB
val = result.getBlob(result.getColumnIndex(info.columnName))
break
}
obj[info.name] = val
})
// 3.3.将对象填入结果数组
arr.push(obj)
Logger.debug('查询到数据:', JSON.stringify(obj))
}
return arr
}
buildValueBucket(obj: any, columns: ColumnInfo[]): relationalStore.ValuesBucket{
let value = {}
columns.forEach(info => {
let val = obj[info.name]
if (typeof val !== 'undefined') {
value[info.columnName] = val // 数据库的字段名和我们添加时候写的属性名称对应起来
}
})
return value
}
}
let dbUtil: DbUtil = new DbUtil();
export default dbUtil as DbUtil
数据库这部分我没能实现,只创建了数据模型后实现了数据动态化。