首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

HarmonyOS开发实战( Beta5.0)在TaskPool线程中操作关系型数据库实现案例实践

  • 25-03-03 06:41
  • 2344
  • 6031
blog.csdn.net

鸿蒙HarmonyOS开发往期文章必看:

HarmonyOS NEXT应用开发性能实践总结

最新版!“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!(从零基础入门到精通)


介绍

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

效果图预览

使用说明

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

实现思路

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

高性能知识点

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

工程结构&模块类型

  1. operaterdbintaskpool // har类型
  2. |---constant
  3. | |---RdbConst.ets // Rdb常量
  4. |---model
  5. | |---Contact.ets // Contact数据结构
  6. | |---DataSource.ets // 列表数据模型
  7. |---view
  8. | |---DatabaseConnection.ets // 数据库相关操作
  9. | |---OpetateRDBTaskPool.ets // 主页面
  10. | |---TaskPool.ets // TaskPool线程

模块依赖

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

最后

小编在之前的鸿蒙系统扫盲中,有很多朋友给我留言,有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)路线图、学习视频、文档用来跟着学习是非常有必要的。 

如果你是一名有经验的资深Android移动开发、Java开发、前端开发、对鸿蒙感兴趣以及转行人员

鸿蒙 NEXT 全栈开发学习笔记  希望这一份鸿蒙学习文档能够给大家带来帮助~


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

​

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

路线图适合人群:

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

2.视频学习教程+学习PDF文档

HarmonyOS Next 最新全套视频教程

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

​​

总结

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

文章知识点与官方知识档案匹配,可进一步学习相关知识
MySQL入门技能树关系型数据库10 分钟了解 MySQL93970 人正在系统学习中
鸿蒙NEXT全套学习资料
微信名片
注:本文转载自blog.csdn.net的让开,我要吃人了的文章"https://blog.csdn.net/weixin_55362248/article/details/142213270"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

101
推荐
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2024 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top