前面两篇文章 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: numbername:stringfinished: booleanconstructor(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 指定字段IDlet id = result.getLong(result.getColumnIndex('ID'))//定义name 等于 result.getString 字符串类型要用getString getColumnIndex指定读取字段NAMElet name = result.getString(result.getColumnIndex('NAME'))//定义 finished 等于result.getLong 因为 boolean类型存入数据库 就是数字类型 0/1 我们getColumnIndex自定FINISHEDlet finished = result.getLong(result.getColumnIndex('FINISHED'))//然后 直接将结果push 到TaskList里面//注意这里finished是数字类型的 0/1 但我们类中是boolean 类型 所以要转一下TaskList.push({id,name,finished: (finished == 1?true:false)})}//最后 将处理好的TaskList返回回去return TaskList
}
我自认为自己的注释已经写的很用心了