黑马健康应用开发五

数据模型

记录项

我们把饮食和运动,定义到一个模型里,从单元开始,建立数据模型,用于显示食物和运动,食物和运动用到一个数据模型,根据数据类型里用于区分的参数实现显示不同的页面效果。

饮食记录

数据模型通用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
 

数据库这部分我没能实现,只创建了数据模型后实现了数据动态化。

gitee 源码:
https://gitee.com/cheng_yong_xu/ho_healthy

  • 18
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值