HarmonyOS开发案例:列表场景实例-TaskPool

介绍

本实例通过列表场景实例讲解,介绍在TaskPool线程中操作关系型数据库的方法,涵盖单条插入、批量插入、删除和查询操作。

效果图预览

使用说明

  1. 进入页面有insert(单条数据插入)、batch insert(批量数据插入)、query(查询操作)三个按钮,点击query按钮后列表数据会从数据库更新,列表每条后面都有删除按钮,可以从数据库删除数据。

实现思路

  1. 首先,构建一个关系型数据库并封装数据库操作方法涉及几个关键步骤。
  • 通过getRdbStore方法初始化一个关系型数据库,用户可以根据STORE_CONFIG配置RdbStore的参数,使用Promise异步回调。
// 初始化数据库 public async initRdbStore(context: common.Context): Promise<void> {this.rdbStore = await rdb.getRdbStore(context, STORE_CONFIG);await this.createTable();}
  • 使用executeSql接口初始化数据库表结构和相关数据。
// 创建数据库表private async createTable(): Promise<void> { await this.rdbStore.executeSql(SQL_CREATE_TABLE)
}
  • 封装数据库操作方法分别为数据插入、数据删除和数据查询。
// 单条数据插入数据库
public async insertData(context: common.Context, Contact: Contact): Promise<void> {let value1 = Contact.name;let value2 = Contact.phone;const valueBucket: ValuesBucket = {'name': value1,'phone': value2}if (this.rdbStore != undefined) {let ret = await this.rdbStore.insert(TABLE_NAME, valueBucket, rdb.ConflictResolution.ON_CONFLICT_REPLACE)}
}// 批量插入数据库
public async batchInsertData(context: common.Context, array: Array<Contact>): Promise<void> {let valueBuckets: Array<ValuesBucket> = [];for (let index = 0; index < array.length; index++) {let Contact = array[index] as Contact;let value1 = Contact.name;let value2 = Contact.phone;const valueBucket: ValuesBucket = {'name': value1, 'phone': value2}valueBuckets.push(valueBucket);}if (this.rdbStore != undefined) {let ret = await this.rdbStore.batchInsert(TABLE_NAME, valueBuckets)}
}// 删除操作
public async deleteData(context: common.Context, Contact: Contact): Promise<boolean> { try {predicates.or().equalTo('id', Contact.id)let row = await this.rdbStore.delete(predicates);logger.info(TAG, `delete contact success:${row}`)} catch (e) {logger.error(TAG, 'delete failed:', JSON.stringify(e));promptAction.showToast({message: JSON.stringify(e),duration: 2000});return false;}return true;
}// 查询数据库
public async query(context: common.Context): Promise<Array<Contact>> {if (!this.rdbStore) {logger.info(TAG, 'query rdbStore is null')await this.initRdbStore(context);} else {try {this.rdbStore = await rdb.getRdbStore(context, STORE_CONFIG);// 默认查询所有列let resultSet: rdb.ResultSet = await this.rdbStore.query(predicates);logger.info(TAG, 'result is ' + JSON.stringify(resultSet.rowCount))// 处理查询到的结果数组return this.getListFromResultSet(resultSet)} catch (e) {logger.error(TAG, 'query result error:' + JSON.stringify(e))}}return [];
}
  1. 创建任务池(taskpool)为数据库操作提供一个多线程的运行环境。
  • 将创建好的任务放入taskpool内部任务队列。(注:任务不会立即执行,而是等待分发到工作线程执行。)
export async function taskPoolExecuteQuery(context: common.Context): Promise<Array<Contact>> {let task: taskPool.Task = new taskPool.Task(query, context); // query函数调用 需使用装饰器@Concurrentlet result: Array<Contact> = await taskPool.execute(task) as Array<Contact>;
}
  • 在使用TaskPool时,执行的并发函数需要使用@Concurrent装饰器修饰,通过相关校验。
export async function taskPoolExecuteQuery(context: common.Context): Promise<Array<Contact>> {try {let task: taskPool.Task = new taskPool.Task(query, context); // query函数调用 需使用装饰器@Concurrentlet result: Array<Contact> = await taskPool.execute(task) as Array<Contact>;return result;} catch (err) {logger.error(TAG, 'query error:' + JSON.stringify(err));return [];}
}
  1. 在taskpool线程中操作关系型数据库方法的调用。
// 单条数据插入按钮
Button('insert', { type: ButtonType.Normal, stateEffect: true }).borderRadius($r('app.integer.operate_rdb_in_taskpool_button_border_radius')).backgroundColor($r('app.color.operate_rdb_in_taskpool_button_background_color')).width($r('app.integer.operate_rdb_in_taskpool_button_width')).height($r('app.integer.operate_rdb_in_taskpool_button_height')).onClick(async () => {// 单条数据插入操作taskPoolExecuteInsert(context, originalContact);
})// 批量数据插入操作
taskPoolExecuteBatchInsert(context, this.sourceData);// 数据查询操作
taskPoolExecuteQuery(context).then((contact: Array<Contact>) => {this.dataArray.clear()this.dataArray.pushData(contact)
});// 数据删除操作
taskPoolExecuteDelete(context, item).then((isDelete: boolean) => {if (isDelete) {// 数据库删除成功后 操作列表数据源this.dataArray.deleteData(item)}
});

高性能知识点

本示例使用了LazyForEach进行数据懒加载,LazyForEach懒加载可以通过设置cachedCount属性来指定缓存数量,同时搭配组件复用能力以达到性能最优效果。

工程结构&模块类型

operaterdbintaskpool                             // har类型
|---constant
|   |---RdbConst.ets                             // Rdb常量
|---model
|   |---Contact.ets                              // Contact数据结构 
|   |---DataSource.ets                           // 列表数据模型
|---view
|   |---DatabaseConnection.ets                   // 数据库相关操作
|   |---OpetateRDBTaskPool.ets                   // 主页面
|   |---TaskPool.ets                             // TaskPool线程

模块依赖

本实例依赖common模块来实现资源的调用以及路由模块来注册路由。

最后

小编在之前的鸿蒙系统扫盲中,有很多朋友给我留言,不同的角度的问了一些问题,我明显感觉到一点,那就是许多人参与鸿蒙开发,但是又不知道从哪里下手,因为资料太多,太杂,教授的人也多,无从选择。有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习是非常有必要的。 

为了确保高效学习,建议规划清晰的学习路线,涵盖以下关键阶段:

 点击→【纯血版鸿蒙全套最新学习资料】希望这一份鸿蒙学习资料能够给大家带来帮助~


 鸿蒙(HarmonyOS NEXT)最新学习路线

该路线图包含基础技能、就业必备技能、多媒体技术、六大电商APP、进阶高级技能、实战就业级设备开发,不仅补充了华为官网未涉及的解决方案

路线图适合人群:

IT开发人员:想要拓展职业边界
零基础小白:鸿蒙爱好者,希望从0到1学习,增加一项技能。
技术提升/进阶跳槽:发展瓶颈期,提升职场竞争力,快速掌握鸿蒙技术

点击→纯血版全套鸿蒙HarmonyOS学习资料

2.视频学习资料+学习PDF文档

这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、(南向驱动、嵌入式等)鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。

HarmonyOS Next 最新全套视频教程

​​

 (鸿蒙语法ArkTS、TypeScript、ArkUI教程……)

 纯血版鸿蒙全套学习资料(面试、文档、全套视频等)

                   

鸿蒙南向开发技术

​​

鸿蒙APP开发必备

​​

《鸿蒙 (OpenHarmony)开发基础到实战手册》

OpenHarmony北向、南向开发环境搭建

​​

《鸿蒙开发基础》

​​

《鸿蒙开发进阶》

《鸿蒙进阶实战》

​​


点击→纯血版全套鸿蒙HarmonyOS学习资料

总结

参与鸿蒙开发,你要先认清适合你的方向,如果是想从事鸿蒙应用开发方向的话,可以参考本文的学习路径,简单来说就是:为了确保高效学习,建议规划清晰的学习路线

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/403305.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【安卓】播放多媒体文件

文章目录 播放音频播放视频 播放音频 在Android中播放音频文件一般是使用MediaPlayer类实现的&#xff0c;它对多种格式的音频文件提供了非常全面的控制方法&#xff0c;从而使播放音乐的工作变得十分简单。 MediaPlayer类中常用的控制方法。 常用方法名描述setDataSource()设…

使用html+css+js实现完整的登录注册页面

在这篇博客中&#xff0c;我们将讨论如何使用简单的 HTML 和 CSS 构建一个登录与注册页面。这个页面包含两个主要部分&#xff1a;登录界面和注册界面。我们还会展示如何通过 JavaScript 切换这两个部分的显示状态。 页面结构 我们将创建一个页面&#xff0c;其中包含两个主要…

CSS3-新特性

1.新增选择器 1.属性选择器 2.结构伪类选择器 3.伪元素选择器&#xff08;重点&#xff09; 4.CSS3 盒子模型 2.CSS3滤镜filter 3.CSS3 calc 函数 4.CSS3 过渡&#xff08;重点&#xff09;

95后医疗行业女性转型记:如何成功踏入人工智能项目管理领域

分享目录 一、自我介绍&#xff0c;给大家分享一下拿到offer的心情吧 二、在整个求职转型陪跑营里&#xff0c;你收获最大的三个点是什么&#xff1f; 三、求职转行过程中&#xff0c;你遇到了哪些困难&#xff1f;七芊老师和强哥是怎么帮助你的&#xff1f;你是怎么走过来的…

seata的使用(SpringBoot项目整合seata)

文章目录 1、解压 seata-server-1.7.1.zip2、启动 双击 seata-server.bat3、启动 seata 控制台用户界面4、所有分布式事务相关数据库要有undo-log5、项目引入seata依赖6、项目添加seata配置7、代码实现&#xff1a; 1、解压 seata-server-1.7.1.zip 2、启动 双击 seata-server.…

Polars简明基础教程十二:可视化(二)

设置绘图后端 我们可以使用 hv.extension 更改绘图后端。但是&#xff0c;我们不在此处运行此单元格&#xff0c;因为它会导致下面的 Matplotlib/Seaborn 图表无法渲染。 注释&#xff1a; hvPlot 利用 HoloViews 库来构建图表&#xff0c;并且可以使用多个后端进行渲染&…

微信小程序骨架屏

骨架屏是常用的一种优化方案&#xff0c;针对于页面还未加载完时给用户的一种反馈方式。如果自己要写骨架屏有点复杂因为页面的元素过多且不稳定&#xff0c;这边直接使用微信开发工具生成骨架屏。也不只有微信开发工具有像常用的抖音开发工具&#xff0c;字节开发工具都有对应…

使用MicroApp重构旧项目

前言 随着技术的飞速发展&#xff0c;我们公司内部一个基于“上古神器” jQuery PHP 构建的十年历史老项目已显力不从心&#xff0c;技术非常老旧且维护成本高昂&#xff0c;其实已经无数次想要重构&#xff0c;但是苦于历史遗留原因以及业务的稳定性而一直难以下手&#xff0…

Tomcat的核心文件讲解

参考视频&#xff1a;对应视频 server.xml中的以下部分可修改&#xff1a; 1.connector标签里的port可以修改。--修改端口号 Tomcat默认端口号&#xff1a;8080 <Connector connectionTimeout"20000" maxParameterCount"1000"port"8080" prot…

调研-音视频

音视频 基础概念主要内容音频基础概念音频量化过程音频压缩技术视频基础概念视频bug视频编码H264视频像素格式YUVRGB参考文献基础概念 ● 实时音视频应用环节 ○ 采集、编码、前后处理、传输、解码、缓冲、渲染等很多环节。 主要内容 音频 基础概念 三要素:音调(音频)、…

算法的学习笔记—链表中倒数第 K 个结点(牛客JZ22)

&#x1f600;前言 在编程过程中&#xff0c;链表是一种常见的数据结构&#xff0c;它能够高效地进行插入和删除操作。然而&#xff0c;遍历链表并找到特定节点是一个典型的挑战&#xff0c;尤其是当我们需要找到链表中倒数第 K 个节点时。本文将详细介绍如何使用双指针技术来解…

8.16 day bug

bug1 题目没看仔细 额外知识 在 Bash shell 中&#xff0c;! 符号用于历史扩展功能。当你在命令行中输入 ! 后跟一些文本时&#xff0c;Bash 会尝试从你的命令历史中查找与该文本相匹配的命令。这是一种快速重用之前执行过的命令的方法。 如何使用历史扩展 基本用法: !strin…

利用亚马逊云科技Bedrock和LangChain开发AI驱动数据分析平台

项目简介&#xff1a; 小李哥将继续每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿AI技术解决方案&#xff0c;帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS AI最佳实践&#xff0c;并应用到自己的日常工作里。 本次介绍的是如何在亚马逊云科技上SageMak…

一次现网redis CPU使用率异常定位

背景 618大促前&#xff0c;运维对系统做巡检时发现redis cpu利用率白天基本保持在72%左右&#xff0c;夜里也在60%以上。担心618流量比平时大&#xff0c;导致redis超负荷&#xff0c;因此找开发进行优化&#xff0c;降低redis的负载。 定位思路 其实资源使用率过高定位都…

Taro+Vue 创建微信小程序

TaroVue 创建微信小程序 一、全局安装 tarojs/cli二、项目初始化三、现在去启动项目吧 一、全局安装 tarojs/cli npm install -g tarojs/cli //安装 npm info tarojs/cli //查看安装信息 如果正常显示版本说明成功了&#xff0c;就直接跳到第二步吧官网说&#xff1a;…

Unity引擎基础知识

目录 Unity基础知识概要 1. 创建工程 2. 工程目录介绍 3. Unity界面和五大面板 4. 游戏物体创建与操作 5. 场景和层管理 6. 组件系统 7. 脚本语言C# 8. 物理引擎和UI系统 学习资源推荐 Unity引擎中如何优化大型游戏项目的性能&#xff1f; Unity C#脚本语言的高级编…

【ML】Image Augmentation)的作用、使用方法及其分类

图像增强&#xff08;Image Augmentation&#xff09;的作用、使用方法及其分类 1. 图像增强的定义2. 图像增强的作用3. 什么时候使用图像增强&#xff1f;4. 图像增强详细方法分类梳理4.1 图像增强方法列表4.2 边界框增强方法5. 参考资料 yolov3&#xff08;一&#xff1a;模型…

K8S资源之PVPVC

概念 类似于Docker的数据卷挂载&#xff0c;将Pod中重要的文件挂载到宿主机上&#xff0c;如果Pod发生崩溃等情况自愈时&#xff0c;保证之前存储的数据没有丢失。 如上图中&#xff0c;将各个Pod中的目录挂载到存储层&#xff0c;如果Pod宕机后自愈均从存储层获取之前的数据…

00_remipi_软件评估记录

1.CPU 1.1 查看CPU信息命令 cat /proc/cpuinfo * processor: 系统中逻辑处理核心的编号&#xff0c;对于多核处理器则可以是物理核&#xff0c;或者使用超线程技术虚拟的逻辑核。 BogoMIPS: 在系统内核启动时粗略测算的CPU每秒运行百万条指令数&#xff08;Million Instruct…