HarmonyOS鸿蒙Next中能否提供一个使用taskpool查询关系型数据库的demo
HarmonyOS鸿蒙Next中能否提供一个使用taskpool查询关系型数据库的demo
由于需要大规模的数据库查询操作,需要改为用taskpool来进行查询,但修改后数据无法正常查询。能否提供一个taskpool查询数据库的样例呢?
@Concurrent
function queryAsync(context: common.Context, predicates: relationalStore.RdbPredicates) {
const STORE_CONFIG: relationalStore.StoreConfig = {
name: 'localNote.db',
securityLevel: relationalStore.SecurityLevel.S1
};
relationalStore.getRdbStore(context, STORE_CONFIG).then((store) => {
if (store) {
return store.querySync(predicates)
} else return undefined
})
}
taskPoolExecuteQuery(context: common.Context, predicates: relationalStore.RdbPredicates): Promise<relationalStore.ResultSet> {
return new Promise((resolve: Function, reject: Function) => {
try {
let task: taskpool.Task = new taskpool.Task(queryAsync, context, predicates)
taskpool.execute(task).then((ret: Object) => {
resolve(ret as relationalStore.RdbPredicates)
})
} catch (err) {
Logger.error('测试,查询畅聊数据query error:' + JSON.stringify(err));
reject()
}
})
}
queryByChatID(context: Context, chatIDs: number[]): Promise<ChatUserData[]> {
let predicates = new relationalStore.RdbPredicates(RDBConstants.CHAT_USER_TABLE.tableName);
predicates.in('chatId', chatIDs);
// let context = GlobalContext.getInstance().getContext(CommonConstants.UIABILITY_CONTEXT) as common.UIAbilityContext
return this.rdb
.taskPoolExecuteQuery(context, predicates)
.then((resultSet: relationalStore.ResultSet) => {
return this._resultSetToChatUserDataList(resultSet)
})
}
更多关于HarmonyOS鸿蒙Next中能否提供一个使用taskpool查询关系型数据库的demo的实战教程也可以访问 https://www.itying.com/category-93-b0.html
这边给您提供一个worker线程的方案,您参考一下:
index.ets
import worker, { MessageEvents } from '@ohos.worker';
import { Student } from '../database/student';
const workerInstance = new worker.ThreadWorker("entry/ets/workers/Worker.ets");
let context = getContext();
let nameArr = ['jack', 'tom', 'anlay', 'jany', 'lili', 'Aaron', 'Ben', 'Brandon', 'Cody', 'Mason'];
@Entry
@Component
struct Index {
@State list: Student[] = [];
aboutToAppear(): void {
workerInstance.postMessage({ code: 99, data: context });
workerInstance.onmessage = (e: MessageEvents): void => {
if (e.data.code == 101) {
this.list = e.data.data;
}
};
}
build() {
Row() {
Column() {
Row() {
Button('建表')
.onClick(() => {
workerInstance.postMessage({ code: 1, data: context });
});
Button('插入数据')
.onClick(() => {
let student: Student = new Student();
let index = Math.ceil(Math.random() * 10) % 10;
student.name = nameArr[index];
student.age = Math.ceil(Math.random() * 100) % 18;
student.salary = 2000 + Math.ceil(Math.random() * 10000) % 10000;
workerInstance.postMessage({ code: 2, data: student });
});
Button('查询数据')
.onClick(() => {
workerInstance.postMessage({ code: 3, data: {} });
});
}
.width('100%')
.margin({ top: 10 })
.justifyContent(FlexAlign.SpaceAround);
ForEach(this.list, (item: Student, index: number) => {
ViewA({ student: item });
});
}
.height('100%')
.width('100%');
}
}
}
@Component
export struct ViewA {
student: Student = new Student();
build() {
Row() {
Text("姓名:" + this.student.name);
Text("年龄:" + this.student.age.toString());
Text("费用:" + this.student.salary.toString());
}
.width('100%')
.margin({ top: 10 })
.justifyContent(FlexAlign.SpaceEvenly);
}
}
worker.ets
import { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS';
import Rdb from '../database/rdb';
import { Student } from '../database/student';
const workerPort: ThreadWorkerGlobalScope = worker.workerPort;
let rdbTest: Rdb;
workerPort.onmessage = async (e: MessageEvents) => {
console.log('testtag onmessage' + JSON.stringify(e));
if (e.data.code == 1) {
rdbTest.CreateTable(); // 建表
} else if (e.data.code == 2) {
let student = e.data.data as Student;
await rdbTest.InsertData(student.name, student.age, student.salary); // 添加数据
let studentArr = await rdbTest.QueryDataArr(); // 查询新数据
workerPort.postMessage({ code: 101, data: studentArr }); // 返回主线程
} else if (e.data.code == 3) {
let studentArr = await rdbTest.QueryDataArr(); // 查询数据
workerPort.postMessage({ code: 101, data: studentArr }); // 返回主线程
} else {
rdbTest = await new Rdb('Student.db', e.data.data); // 创建数据库
}
console.log('testtag onmessage end');
}
workerPort.onmessageerror = (e: MessageEvents) => {
console.log('testtag onmessageerror' + e);
}
workerPort.onerror = (e: ErrorEvent) => {
console.error('Worker error: ' + e);
}
rdb.ets
import relationalStore from '@ohos.data.relationalStore';
import { BusinessError, Callback } from '@ohos.base';
import { ValuesBucket } from '@ohos.data.ValuesBucket';
import { Student } from './student';
export default class Rdb {
rdbStore?: relationalStore.RdbStore;
constructor(storeName: string, context: Context) {
const STORE_CONFIG: relationalStore.StoreConfig = {
name: storeName,
securityLevel: relationalStore.SecurityLevel.S1,
};
relationalStore.getRdbStore(context, STORE_CONFIG, (err: BusinessError, rdbStore: relationalStore.RdbStore) => {
this.rdbStore = rdbStore;
if (err) {
console.error(`Get RdbStore failed, code is ${err.code}, message is ${err.message}`);
return;
}
console.info(`Get ${storeName} RdbStore successfully.`);
});
}
CreateTable() {
const SQL_CREATE_TABLE = 'CREATE TABLE IF NOT EXISTS STUDENT (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT, AGE INTEGER, SALARY INTEGER)';
if (this.rdbStore) {
this.rdbStore.executeSql(SQL_CREATE_TABLE);
console.info(`CreateTable successfully.`);
}
}
InsertData(name: string, age: number, salary: number) {
const valueBucket: ValuesBucket = { 'NAME': name, 'AGE': age, 'SALARY': salary };
setTimeout(() => {
if (this.rdbStore) {
this.rdbStore.insert('STUDENT', valueBucket, (err, rowId) => {
if (err) {
console.error(`Failed to insert data. Code: ${err.code}, message: ${err.message}`);
return;
}
console.info(`Succeeded in inserting data. rowId: ${rowId}`);
});
}
}, 10);
}
async QueryDataArr(): Promise<Student[]> {
let predicates = new relationalStore.RdbPredicates("STUDENT");
let rdbData: Array<Student> = [];
if (this.rdbStore) {
let resultSet = this.rdbStore.querySync(predicates, ["ID", "NAME", "AGE", "SALARY"]);
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"));
let student = new Student();
student.id = id;
student.name = name;
student.age = age;
student.salary = salary;
rdbData.push(student);
}
resultSet.close();
}
return rdbData;
}
}
这种场景下用worker感觉比较好,您看一下是否满足需求。
每个worker的实例对象代表一个子线程,和主线程传递信息是独立的,不会收到其他子线程的消息。
更多关于HarmonyOS鸿蒙Next中能否提供一个使用taskpool查询关系型数据库的demo的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,可以使用taskpool
来执行并发任务,包括查询关系型数据库。以下是一个简单的示例,展示如何在taskpool
中查询关系型数据库。假设你已经创建了数据库和表,并且配置了数据库连接。
- 导入必要的模块:
import relationalStore from '@ohos.data.relationalStore';
import taskpool from '@ohos.taskpool';
- 定义数据库查询任务:
async function queryDatabaseTask() {
const context = ...; // 获取上下文
const store = await relationalStore.getRdbStore(context, {
name: 'myDatabase.db',
securityLevel: relationalStore.SecurityLevel.S1
});
const sql = 'SELECT * FROM myTable WHERE id = ?';
const args = [1]; // 查询条件参数
const result = await store.query(sql, args);
return result;
}
- 使用
taskpool
执行查询任务:
async function executeQuery() {
const task = new taskpool.Task(queryDatabaseTask);
const result = await taskpool.execute(task);
console.log('Query result:', result);
}
- 调用
executeQuery
函数:
executeQuery();
这个示例展示了如何在taskpool
中执行数据库查询任务。taskpool
允许你在后台线程中执行耗时操作,避免阻塞主线程。
在HarmonyOS鸿蒙Next中,可以使用taskpool
进行多线程任务调度,但直接查询关系型数据库的操作通常在主线程中完成。以下是一个简单的示例,展示如何在taskpool
中执行数据库查询任务:
import taskpool from '@ohos.taskpool';
import relationalStore from '@ohos.data.relationalStore';
async function queryDatabase() {
const context = ...; // 获取上下文
const store = await relationalStore.getRdbStore(context, { name: 'myDatabase.db' });
const sql = 'SELECT * FROM myTable';
const resultSet = await store.query(sql, []);
return resultSet;
}
taskpool.execute(queryDatabase).then(result => {
console.log('Query result:', result);
}).catch(error => {
console.error('Query failed:', error);
});
该示例展示了如何在taskpool
中执行数据库查询,并将结果返回到主线程。请确保在queryDatabase
函数中正确处理数据库连接和上下文。