鸿蒙5.0开发进阶: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)
    }
  • 封装数据库操作方法分别为数据插入、数据删除和数据查询。 ```javascript // 单条数据插入数据库 public async insertData(context: common.Context, Contact: Contact): Promise { 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): Promise { let valueBuckets: Array = []; 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 { 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> { 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 []; }


2. **创建任务池(taskpool)为数据库操作提供一个多线程的运行环境。**

- 将创建好的任务放入taskpool内部任务队列。(注:任务不会立即执行,而是等待分发到工作线程执行。)
```javascript
export async function taskPoolExecuteQuery(context: common.Context): Promise<Array<Contact>> {
  let task: taskPool.Task = new taskPool.Task(query, context); // query函数调用 需使用装饰器@Concurrent
  let 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函数调用 需使用装饰器@Concurrent
      let 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线程中操作关系型数据库方法的调用。 ```javascript // 单条数据插入按钮 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) => { this.dataArray.clear() this.dataArray.pushData(contact) });

// 数据删除操作 taskPoolExecuteDelete(context, item).then((isDelete: boolean) => { if (isDelete) { // 数据库删除成功后 操作列表数据源 this.dataArray.deleteData(item) } });


### 高性能知识点

本示例使用了[LazyForEach](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-rendering-control-lazyforeach-0000001820879609)进行数据懒加载,LazyForEach懒加载可以通过设置cachedCount属性来指定缓存数量,同时搭配[组件复用](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/best-practices-long-list-0000001728333749#section36781044162218)能力以达到性能最优效果。

### 工程结构&模块类型

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


### 模块依赖

本实例依赖common模块来实现[资源](https://gitee.com/harmonyos-cases/cases/blob/master/CommonAppDevelopment/common/utils/src/main/resources/base/element)的调用以及路由模块来[注册路由](https://gitee.com/harmonyos-cases/cases/blob/master/CommonAppDevelopment/feature/perfermance/routermodule/src/main/ets/router/DynamicsRouter.ets)。

### 参考资料

[@ohos.taskpool(启动任务池)](https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-taskpool-V5#taskpoolexecute)

[@ohos.data.relationalStore(关系型数据库)](https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-data-relationalstore-V5)

[多线程能力场景化示例实践](https://gitee.com/harmonyos-cases/cases/blob/ceb9493cce0d713658f3a99c2bb9f2c73aca886a/docs/performance/multi_thread_capability.md#%E5%9C%A8taskpool%E7%BA%BF%E7%A8%8B%E6%93%8D%E4%BD%9C%E5%85%B3%E7%B3%BB%E5%9E%8B%E6%95%B0%E6%8D%AE%E5%BA%93)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值