Administrator
发布于 2024-05-08 / 22 阅读
0
0

鸿蒙开发-关系数据库

约束限制

  • 系统默认日志方式是WAL(Write Ahead Log)模式,系统默认落盘方式是FULL模式。

  • 数据库中连接池的最大数量是4个,用以管理用户的读操作。

  • 为保证数据的准确性,数据库同一时间只能支持一个写操作

  • 当应用被卸载完成后,设备上的相关数据库文件及临时文件会被自动清除。

示例:

1.定义视图数据模型

@Observed
export default class TaskInfo {
  id:number
  name:string
  finished:boolean

  constructor(id:number ,name:string) {
    this.id = id
    this.name = name
    this.finished = false
  }
}

2.定义数据操作模型

import relationalStore from '@ohos.data.relationalStore';
import TaskInfo  from '../viewmodel/TaskInfo'
import { Context } from '@kit.AbilityKit';


class TaskModel {

  private rdbStore : relationalStore.RdbStore
  private tableName = "TASK"
  /**
   * 初始化任务表
   * 项目刚启动
   */
  initTaskDB(context:Context){
    //1.rdb 配置
    const config: relationalStore.StoreConfig = {
      name :'MyApplication.db',
      securityLevel: relationalStore.SecurityLevel.S1
    }

    //2.初始化SQL语句
    const sql = 'CREATE TABLE IF NOT EXISTS TASK (' +
      'ID INTEGER PRIMARY KEY AUTOINCREMENT,' +
      ' NAME TEXT NOT NULL,' +
      ' FINISHED bit)'; // 建表Sql语句


    //3.获取rdb
    relationalStore.getRdbStore(context ,config, (err,rdbStore)=>{
      if (err) {
        console.log('testTag',`创建rdbStore失败. Code:${err.code}, message:${err.message}`);
        return;
      }
      console.log('testTag',`创建task表成功!`);
      rdbStore.executeSql(sql); // 创建数据表
      this.rdbStore = rdbStore
    })
  }
  /**
   * 查询任务列表
   */
  async getTaskList(){
    //1.构建查询条件
    let predicates = new relationalStore.RdbPredicates(this.tableName) //table name
    //2.查询
    let result = await this.rdbStore.query(predicates, ['ID', 'NAME', 'FINISHED'])
    //3.解析查询结果
    //3.1定义一个数组,
    let tasks :TaskInfo[] = []
    //3.2.遍历+封装
    while (!result.isAtLastRow){
      //3.3指针移到下一行
      result.goToNextRow()
      //3.4获取数据
      let id = result.getLong(result.getColumnIndex("ID"))
      let name = result.getString(result.getColumnIndex("NAME"))
      let finished = result.getLong(result.getColumnIndex("FINISHED"))
      //3.5封装到数组
      tasks.push({ id, name, finished: !!finished})
    }

    console.log('testTag',`查询到数据:` ,JSON.stringify(tasks));
    return tasks

  }

  /**
   * 添加一个新的任务
   * @param name
   */
  addTask(name:string):Promise<number> {
    return this.rdbStore.insert(this.tableName , {name ,finished:false})
  }

  /**
   * 添加一个新的任务
   * @param id
   * @param finish
   */
  updateTaskStatus(id:number ,finish:boolean):Promise<number>{
    //要更新的数据
    const valueBucket :relationalStore.ValuesBucket = {
      'FINISHED': finish
    };
    //更新的条件
    let predicates = new relationalStore.RdbPredicates(this.tableName)
    predicates.equalTo("ID",id)
    //更新造作
    return this.rdbStore.update(valueBucket  ,predicates)
  }


  /**
   * 根据id 删除任务id
   * @param id
   */
  deleteTaskById(id:number ){
    //删除的条件
    let predicates = new relationalStore.RdbPredicates(this.tableName)
    predicates.equalTo("ID",id)
    //删除
    return this.rdbStore.delete(predicates)
  }

}

let taskModel = new TaskModel()
export default taskModel as TaskModel ;

3.调用


评论