HarmonyOS Worker里面进行数据库查询?

如何在Worker里面进行主线程中创建的数据库的查询。因为单例里面的relationalStore.RdbStore无法获取,要在relationalStore.RdbStore里面重新初始化数据库。

阅读 482
1 个回答

参考如下demo:

//rdb.ets
import relationalStore from '@ohos.data.relationalStore';
import { BusinessError, Callback } from '@ohos.base';
import { ValuesBucket } from '@ohos.data.ValuesBucket';

export default class Rdb {
  rdbStore?: relationalStore.RdbStore;

  constructor(storeName: string, context: Context) {
    // 数据库配置
    const STORE_CONFIG: relationalStore.StoreConfig = {
      name: storeName, securityLevel: relationalStore.SecurityLevel.S1,
    };
    // 获取数据库Store
    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 InsertAsync(name: string, age: number, salary: number) {
    let start = Date.now();
    const valueBucket:
      ValuesBucket = {
      'NAME': name, 'AGE': age, 'SALARY': salary
    };
    /* while (Date.now() - start <1000) { continue; } console.log('延时结束');*/
    if (this.rdbStore) {
      await 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}`);
      })
    }
  }

  DeleteData() {
    let predicates = new relationalStore.RdbPredicates("STUDENT");
    predicates.equalTo("NAME", "Lisa");
    if (this.rdbStore != undefined) {
      (this.rdbStore as relationalStore.RdbStore).delete(predicates, (err, rows) => {
        if (err) {
          console.error(`Delete failed, code is ${err.code},message is ${err.message}`);
          return;
        }
        console.info(`Delete rows: ${rows}`);
      })
    }
  }

  queryData() {
    let predicates =
      new relationalStore.RdbPredicates("STUDENT").notEqualTo('name', 'li').orderByAsc('age').orderByAsc('salary')
    if (this.rdbStore) {
      this.rdbStore.query(predicates, ["ID", 'NAME', 'AGE', 'SALARY'], (err, resultSet) => {
        if (err) {
          console.error(`Failed to query data. Code:${err.code}, message:${err.message}`);
          return;
        }
        console.info(`ResultSet column names: ${resultSet.columnNames}, row count: ${resultSet.rowCount}`);
        if (resultSet.rowCount == -1) {
          console.info("rowCount=-1")
        }
        // 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();
      })
    }
  }

  querySyncData() {
    let predicates =
      new relationalStore.RdbPredicates("STUDENT").notEqualTo('name', 'li').orderByAsc('age').orderByAsc('salary')
    try {
      if (this.rdbStore) {
        let resultSet = this.rdbStore.querySync(predicates, ["ID", 'NAME', 'AGE', 'SALARY']);
        console.info(`ResultSet column names: ${resultSet.columnNames}, row count: ${resultSet.rowCount}`);
        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(`Failed to query data. Code:${err.code}, message:${err.message}`);
      return;
    }
  }

  UpdateData(name: string, age: number, salary: number) {
    const valueBucket: ValuesBucket = {
      'NAME': name, 'AGE': age, 'SALARY': salary
    };
    let predicates = new relationalStore.RdbPredicates("EMPLOYEE");
    predicates.equalTo("NAME", "Lisa");
    if (this.rdbStore != undefined) {
      (this.rdbStore as relationalStore.RdbStore).update(valueBucket, predicates,
        relationalStore.ConflictResolution.ON_CONFLICT_REPLACE, (err, rows) => {
          if (err) {
            console.error(`Updated failed, code is ${err.code},message is ${err.message}`);
            return;
          }
          console.info(`Updated row count: ${rows}`);
        })
    }
  }

  QueryData(callback: Callback<string>) {
    // 配置谓词
    let predicates = new relationalStore.RdbPredicates("STUDENT");
    let jsonData: Array<ValuesBucket> = new Array<ValuesBucket>()
    if (this.rdbStore) {
      this.rdbStore.query(predicates, ["ID", 'NAME', 'AGE', 'SALARY'], (err, resultSet) => {
        if (err) {
          console.error(`Failed to query data. Code:${err.code}, message:${err.message}`);
          return;
        }
        console.info(`ResultSet column names: ${resultSet.columnNames}, row count: ${resultSet.rowCount}`);
        if (resultSet.rowCount == -1) {
          console.info("rowCount=-1")
        }
        // 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}`);
          const valueBucket: ValuesBucket = {
            'ID': id,
            'NAME': name,
            'AGE': age,
            'SALARY': salary
          };
          jsonData.push(valueBucket)
        }
        // 释放数据集的内存
        resultSet.close();
        // console.info("JSON: " + JSON.stringify(jsonData)) callback(JSON.stringify(jsonData))
      })
    }
  }

  queryKeySync() {
    let predicates = new relationalStore.RdbPredicates("STUDENT");
    predicates.equalTo("NAME", "Lisa");
    if (this.rdbStore != undefined) {
      try {
        let resultSet: relationalStore.ResultSet =
          (this.rdbStore as relationalStore.RdbStore).querySync(predicates, ["ID", "NAME", "AGE", "SALARY"]);
        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}`);
      }
    }
  }
}
//Worker.ets
import { ErrorEvent, MessageEvents, ThreadWorkerGlobalScope, worker } from '@kit.ArkTS';
import Rdb from '../database/rdb'

const workerPort: ThreadWorkerGlobalScope = worker.workerPort;
let rdbTest: Rdb;

workerPort.onmessage = async (e: MessageEvents) => {
  console.log('testtag onmessage' + JSON.stringify(e))
  if (e.data == 1) {
    await rdbTest.CreateTable(); //建表
  } else if (e.data == 2) {
    await rdbTest.InsertData("Lisa", 12, 90.0); //添加数据
  } else if (e.data == 3) {
    await rdbTest.queryKeySync();
  } else {
    rdbTest = await new Rdb('Student.db', e.data) //创建数据库
  }
  console.log('testtag onmessage end')
}

workerPort.onmessageerror = (e: MessageEvents) => {
  console.log('testtag onmessageerror' + e)
}

workerPort.onerror = (e: ErrorEvent) => {
}
//Index.ets
import worker from '@ohos.worker';

const workerInstance = new worker.ThreadWorker("entry/ets/workers/Worker.ets");
let context = getContext()

@Entry
@Component
struct Index {
  build() {
    Row() {
      Column() {
        Button('创建数据库')
          .margin({ top: 10 })
          .onClick(() => {
            workerInstance.postMessage(context);
          })
        Button('建表')
          .margin({ top: 10 })
          .onClick(() => {
            workerInstance.postMessage(1);
          })
        Button('插入数据')
          .margin({ top: 10 })
          .onClick(() => {
            workerInstance.postMessage(2);
          })
        Button('查询数据')
          .margin({ top: 10 })
          .onClick(() => {
            workerInstance.postMessage(3);
          })
      }
      .height('100%')
      .width('100%')
    }
  }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进