HarmonyOS鸿蒙Next中如何在taskpool开启的线程内进行关系型数据库的批量插入操作
HarmonyOS鸿蒙Next中如何在taskpool开启的线程内进行关系型数据库的批量插入操作 如何在taskpool开启的线程内,进行关系型数据库的批量插入操作?
context需要传入到线程中。TaskPool和Worker的底层模型为Actor模型,基于Actor模型的内存隔离特性,执行多线程任务和取得结果需要通过跨线程序列化传输。目前支持传输的数据对象可以分为普通对象、可转移对象、可共享对象、Native绑定对象、Sendable对象五种。
EntryAbility.ets
import { AbilityConstant, UIAbility, Want } from '@kit.AbilityKit';
import { hilog } from '@kit.PerformanceAnalysisKit';
import { window } from '@kit.ArkUI';
import Dbutil from '../common/DbUtil';
const TABLE_NAME: string = "EMPLOYEE"
const CREATE_TABLE_SQL: string = `
CREATE TABLE IF NOT EXISTS ${TABLE_NAME} (
ID INTEGER PRIMARY KEY AUTOINCREMENT,
NAME TEXT NOT NULL,
AGE INTEGER NOT NULL,
SALARY DOUBLE NOT NULL
)
`
export default class EntryAbility extends UIAbility {
async onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): Promise<void> {
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
await Dbutil.initDB(this.context)
Dbutil.createTable(CREATE_TABLE_SQL)
}
onDestroy(): void {
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');
}
onWindowStageCreate(windowStage: window.WindowStage): void {
// Main window is created, set main page for this ability
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
windowStage.loadContent('pages/Index5', (err) => {
if (err.code) {
hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
return;
}
hilog.info(0x0000, 'testTag', 'Succeeded in loading the content.');
});
}
onWindowStageDestroy(): void {
// Main window is destroyed, release UI related resources
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
}
onForeground(): void {
// Ability has brought to foreground
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');
}
onBackground(): void {
// Ability has back to background
hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');
}
}
DbUtil.ets
import relationalStore from '@ohos.data.relationalStore'
import { ColumnInfo, ColumnType } from '../common/ColumnInfo'
import { BusinessError } from '@kit.BasicServicesKit'
import { ValuesBucket, ValueType } from '@kit.ArkData'
const DB_FILENAME: string = 'testMySql.db'
class DbUtil {
rdbStore: relationalStore.RdbStore | undefined = undefined
initDB(context: Context): Promise<void> {
let config: relationalStore.StoreConfig = {
name: DB_FILENAME,
securityLevel: relationalStore.SecurityLevel.S1
}
return new Promise((resolve, reject) => {
relationalStore.getRdbStore(context, config)
.then(rdbStore => {
this.rdbStore = rdbStore
console.debug('rdbStore 初始化完成!')
resolve()
})
.catch(err => {
console.error('rdbStore 初始化异常', JSON.stringify(err))
reject(err)
})
})
}
isInited() {
return !!this.rdbStore
}
createTable(sql: string): Promise<void> {
return new Promise((resolve, reject) => {
if (this.rdbStore){
this.rdbStore.executeSql(sql)
.then(() => {
console.debug('创建成功', sql)
resolve()
})
.catch(err => {
console.error('创建失败,' + err.message, JSON.stringify(err))
})
}
})
}
async insertTest(tableName: string, value: ValuesBucket): Promise<number> {
return await new Promise((resolve, reject) => {
console.debug('insertTest1111')
if (!this.rdbStore) return
console.debug('insertTest2222')
this.rdbStore.insert(tableName, value, (err, id) => {
if (err) {
console.error('新增失败!', JSON.stringify(err))
reject(err)
} else {
console.debug('新增成功!新增id:', id.toString())
resolve(id)
}
})
})
}
queryForListPrint(tableName: string){
let predicates = new relationalStore.RdbPredicates(tableName);
predicates.equalTo("NAME", "Rose");
if(this.rdbStore != undefined) {
(this.rdbStore as relationalStore.RdbStore).query(predicates, ["ID", "NAME", "AGE", "SALARY"]).then(resultSet => {
console.info(`ResultSet column names: ${resultSet.columnNames}, column count: ${resultSet.columnCount}`);
// resultSet是一个数据集合的游标,默认指向第-1个记录,有效的数据从0开始。
while (resultSet.goToNextRow()) {
const id = resultSet.getLong(resultSet.getColumnIndex("ID"));
const name = resultSet.getString(resultSet.getColumnIndex("NAME"));
const age = resultSet.getLong(resultSet.getColumnIndex("AGE"));
const salary = resultSet.getDouble(resultSet.getColumnIndex("SALARY"));
console.info(`id=${id}, name=${name}, age=${age}, salary=${salary}`);
}
// 释放数据集的内存
resultSet.close();
}).catch(err => {
console.error(`Query failed, code is ${err.code},message is ${err.message}`);
})
}
}
}
const dbUtil: DbUtil = new DbUtil()
export default dbUtil as DbUtil
更多关于HarmonyOS鸿蒙Next中如何在taskpool开启的线程内进行关系型数据库的批量插入操作的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,使用taskpool
开启的线程内进行关系型数据库的批量插入操作,可以通过以下步骤实现:
-
创建数据库并定义表结构:首先,使用
RdbStore
创建数据库,并定义表结构。 -
使用
taskpool
开启线程:通过taskpool.execute
方法开启一个线程,将数据库操作放在该线程中执行。 -
批量插入数据:在
taskpool
线程中,使用RdbStore
的executeSql
方法或batchInsert
方法进行批量插入操作。
以下是一个示例代码:
import taskpool from '@ohos.taskpool';
import relationalStore from '@ohos.data.relationalStore';
// 定义数据库表结构
const SQL_CREATE_TABLE = "CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT)";
// 初始化数据库
let rdbStore;
async function initDatabase() {
const config = {
name: 'test.db',
securityLevel: relationalStore.SecurityLevel.S1
};
rdbStore = await relationalStore.getRdbStore(globalThis.context, config);
await rdbStore.executeSql(SQL_CREATE_TABLE);
}
// 批量插入数据
async function batchInsertData(records) {
await rdbStore.beginTransaction();
try {
for (let record of records) {
await rdbStore.insert('test', record);
}
await rdbStore.commit();
} catch (e) {
await rdbStore.rollback();
throw e;
}
}
// 使用taskpool开启线程执行批量插入
async function executeBatchInsertInTaskPool(records) {
await taskpool.execute(async () => {
await batchInsertData(records);
});
}
// 初始化数据库并执行批量插入
async function main() {
await initDatabase();
const records = [{ name: 'Alice' }, { name: 'Bob' }, { name: 'Charlie' }];
await executeBatchInsertInTaskPool(records);
}
main();
在这个示例中,initDatabase
函数用于初始化数据库并创建表,batchInsertData
函数用于批量插入数据,executeBatchInsertInTaskPool
函数通过taskpool.execute
方法在子线程中执行批量插入操作。
在HarmonyOS鸿蒙Next中,使用taskpool
开启线程进行关系型数据库的批量插入操作,可以通过以下步骤实现:
- 创建数据库连接:在主线程中创建数据库连接,并获取数据库对象。
- 定义任务函数:在
taskpool
中定义任务函数,接收数据库对象和数据列表。 - 开启事务:在任务函数中开启事务,确保批量插入的原子性。
- 执行批量插入:遍历数据列表,执行插入操作。
- 提交事务:插入完成后提交事务。
- 关闭数据库:在任务函数结束时关闭数据库连接。
通过taskpool.execute
执行任务函数,实现并发批量插入。