往期知识点整理
- 鸿蒙(HarmonyOS)北向开发知识点记录~
- 【鸿蒙实战开发】基于Navigation的路由拦截管理
- 【鸿蒙实战开发】基于组件嵌套的滑动
- 【鸿蒙实战开发】基于Text的自定义字体
- 【鸿蒙实战开发】基于Grid实现混合布局
- 【鸿蒙实战开发】基于ArkUI实现类似Toast弹窗
- 【鸿蒙实战开发】基于短距离通信的BLE蓝牙扫描
- 【鸿蒙实战开发】HiLog日志能力介绍
- 【鸿蒙实战开发】基于HiAppEvent能力的应用崩溃监控上报
- 【鸿蒙实战开发】基于Refresh组件的下拉刷新
- 【鸿蒙实战开发】混合开发-web组件入门和实战
- 【HarmonyOS 鸿蒙实战开发】NavDestination弹窗
- 【HarmonyOS 鸿蒙实战开发】全局自定义组件复用实现案例
- 【HarmonyOS 鸿蒙实战开发】在TaskPool线程中操作关系型数据库实现案例
- 持续更新中……
介绍
本实例通过列表场景实例讲解,介绍在TaskPool线程中操作关系型数据库的方法,涵盖单条插入、批量插入、删除和查询操作。
效果图预览
使用说明
- 进入页面有insert(单条数据插入)、batch insert(批量数据插入)、query(查询操作)三个按钮,点击query按钮后列表数据会从数据库更新,列表每条后面都有删除按钮,可以从数据库删除数据。
实现思路
- 首先,构建一个关系型数据库并封装数据库操作方法涉及几个关键步骤。
- 通过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 [];
}
- 创建任务池(taskpool)为数据库操作提供一个多线程的运行环境。
- 将创建好的任务放入taskpool内部任务队列。(注:任务不会立即执行,而是等待分发到工作线程执行。)
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 [];
}
}
- 在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)
}
});
总是有很多小伙伴反馈说:鸿蒙开发不知道学习哪些技术?不知道需要重点掌握哪些鸿蒙开发知识点? 为了解决大家这些学习烦恼。在这准备了一份很实用的鸿蒙全栈开发学习路线与学习文档给大家用来跟着学习。
针对一些列因素,整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植……等)技术知识点。
《鸿蒙 (Harmony OS)开发学习手册》(共计892页):https://gitcode.com/HarmonyOS_MN/733GH/overview
如何快速入门?
1.基本概念
2.构建第一个ArkTS应用
3.……
开发基础知识:
1.应用基础知识
2.配置文件
3.应用数据管理
4.应用安全管理
5.应用隐私保护
6.三方应用调用管控机制
7.资源分类与访问
8.学习ArkTS语言
9.……
基于ArkTS 开发
1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……
鸿蒙开发面试真题(含参考答案):https://gitcode.com/HarmonyOS_MN/733GH/overview
OpenHarmony 开发环境搭建
《OpenHarmony源码解析》:https://gitcode.com/HarmonyOS_MN/733GH/overview
- 搭建开发环境
- Windows 开发环境的搭建
- Ubuntu 开发环境搭建
- Linux 与 Windows 之间的文件共享
- ……
- 系统架构分析
- 构建子系统
- 启动流程
- 子系统
- 分布式任务调度子系统
- 分布式通信子系统
- 驱动子系统
- ……