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

3 回复

这边给您提供一个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中查询关系型数据库。假设你已经创建了数据库和表,并且配置了数据库连接。

  1. 导入必要的模块
import relationalStore from '@ohos.data.relationalStore';
import taskpool from '@ohos.taskpool';
  1. 定义数据库查询任务
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;
}
  1. 使用taskpool执行查询任务
async function executeQuery() {
    const task = new taskpool.Task(queryDatabaseTask);
    const result = await taskpool.execute(task);
    console.log('Query result:', result);
}
  1. 调用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函数中正确处理数据库连接和上下文。

回到顶部