HarmonyOS 数据持久化 关系型数据库之 查询逻辑编写

前面两篇文章 HarmonyOS 数据持久化 关系型数据库之 初始化操作HarmonyOS 数据持久化 关系型数据库之 增删改逻辑编写 我们已经编写了 初始化 和 增删改 操作的基本逻辑 最后 收尾一下查询的函数

我们还是打开编辑器 然后 打开项目
找到 我们正在写的这个 relationalClass 类
在这里插入图片描述
我们在下面再加一个函数 叫 getTaskList
一个驼峰命名法

第一步 肯定是构建条件 之前我们删和改也有讲过 这里仔细说一下
首先

let predicates = new relationalStore.RdbPredicates("TASK")

RdbPredicates 中 传入表名
然后 你直接用这个 new 出来的对象
predicates 后面 打个点 就会弹出它所有能操作的条件了

predicates.

在这里插入图片描述
因为这里 我们打算查整表 就不传条件了

但是 这里 我们还需要对查询结果做解析 那么 我们需要定义一个类 来记录我们表的数据结构类型
就像java 你要做数据库操作 要有一个属性类 harmonyos这个地方也是一样的

我们在自己这个 utils 包下创建一个 ets文件
在这里插入图片描述
就叫 Task 吧 与表同名 看着规范一点
编写代码如下

@Observed
export default class TaskInfo{
  id: number
  name:string
  finished: boolean
  constructor(id:number, name:string, finished:boolean){
    this.id = id;
    this.name = name;
    this.finished = finished;
  }
}

这里 代码也很简单
之所以 要用 ets文件 是因为 只有ets 才能用 @Observed 注解
这个 注解 我之前的文章也有讲过 HarmonyOS 状态管理装饰器 Observed与ObjectLink 处理嵌套对象/对象数组 结构双向绑定
然后 定义了和我们数据库表相对应的三个字段
最后在constructor构造函数中 接收三个值 给我们的类中的三个值赋值

然后 我们在 relationalClass 中导入 Task

import TaskInfo from "./Task";

在这里插入图片描述
然后 抱歉 我犯了个很致命的错误
报错
Importing ArkTS files to JS and TS files is not allowed.
意思是 ts文件中是不能引入 ets文件的

我们右键relationalClass.ts 如下图选择
在这里插入图片描述
将后缀改为ets即可
在这里插入图片描述
这样 就OK啦
在这里插入图片描述
然后 我们直接编写getTaskList代码如下

//查询 Task 表数据
async getTaskList() {
  // 创建predicates 传入表名
  let predicates = new relationalStore.RdbPredicates("TASK")
  /*
    通过 rdbStore对象 执行 query
    查询函数第一个参数 条件对象 第二个参数 字符串数组 说明要查询的字段
    定义 result 接收查询结果
   */
  let result = await this.rdbStore.query(predicates,["ID", "NAME", "FINISHED"])
  //定义一个 TaskInfo 类型的数组 叫 TaskList 用于接收结果
  let TaskList:TaskInfo[] = [];
  //对result进行遍历  while循环 条件 isAtLastRow当前是否在最后一行 如果不是 则 一直往下走
  while(!result.isAtLastRow) {
    //调用 goToNextRow 进入下一行
    result.goToNextRow()
    //定义id 字段 等于 result.getLong getLong意思是获取数字类型 getColumnIndex 指定字段ID
    let id = result.getLong(result.getColumnIndex('ID'))
    //定义name 等于 result.getString 字符串类型要用getString getColumnIndex指定读取字段NAME
    let name = result.getString(result.getColumnIndex('NAME'))
    //定义 finished 等于result.getLong 因为 boolean类型存入数据库  就是数字类型 0/1 我们getColumnIndex自定FINISHED
    let finished = result.getLong(result.getColumnIndex('FINISHED'))
    //然后 直接将结果push 到TaskList里面
    //注意这里finished是数字类型的  0/1  但我们类中是boolean 类型 所以要转一下
    TaskList.push({
      id,
      name,
      finished: (finished == 1?true:false)
    })
  }
  //最后 将处理好的TaskList返回回去
  return TaskList
}

我自认为自己的注释已经写的很用心了

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-10 18:50:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-10 18:50:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-10 18:50:02       87 阅读
  4. Python语言-面向对象

    2024-03-10 18:50:02       96 阅读

热门阅读

  1. CSS实现块级元素水平垂直居中的3种常用方式

    2024-03-10 18:50:02       42 阅读
  2. 调用GPL 开源库的法律问题

    2024-03-10 18:50:02       39 阅读
  3. Python与FPGA——帧间差算法

    2024-03-10 18:50:02       42 阅读
  4. Ajax与jQuery

    2024-03-10 18:50:02       39 阅读
  5. 轮询--一起学习吧之架构

    2024-03-10 18:50:02       39 阅读
  6. [LeetCode][LCR184]设计自助结算系统——单调队列

    2024-03-10 18:50:02       41 阅读
  7. Hive动态分区静态分区

    2024-03-10 18:50:02       44 阅读
  8. 双非二本实习前的准备day8

    2024-03-10 18:50:02       38 阅读