- import { common } from '@kit.AbilityKit';
- import { fileIo, ReadOptions } from '@kit.CoreFileKit';
- import { relationalStore } from '@kit.ArkData';
- import { BusinessError } from '@kit.BasicServicesKit';
- import { resourceManager } from '@kit.LocalizationKit';
-
- @Entry
- @Component
- struct Index {
- private context: common.UIAbilityContext = this.getUIContext().getHostContext() as common.UIAbilityContext;
- private promptAction = this.getUIContext().getPromptAction();
- private resManage: resourceManager.ResourceManager = this.context.resourceManager;
- private store: relationalStore.RdbStore | undefined = undefined;
- private dbName: string = 'test.db';
- private tableName: string = 'testTable';
- private storeConfig: relationalStore.StoreConfig = {
- name: this.dbName,
- securityLevel: relationalStore.SecurityLevel.S1,
- };
-
- private dbFilePath: string = `${this.context.databaseDir}/rdb`;
-
- build() {
- Column({ space: 20 }) {
- Button('rawfile目录下预置的数据库')
- .type(ButtonType.ROUNDED_RECTANGLE)
- .onClick(() => {
-
- let rawfilePath: string = 'rdb/test.db';
- this.saveRawFileToSandbox(rawfilePath, this.dbFilePath, this.dbName);
- this.initDataBaseDir();
- });
-
- Button('操作resfile目录下预置的数据库')
- .type(ButtonType.ROUNDED_RECTANGLE)
- .onClick(() => {
-
- let resfilePath: string = `${this.context.resourceDir}/rdb/test.db`;
- this.saveResFileToSandbox(resfilePath, this.dbFilePath, this.dbName);
- this.initDataBaseDir();
- });
-
- Button('删除已创建的默认路径数据库文件')
- .type(ButtonType.ROUNDED_RECTANGLE)
- .onClick(() => {
- this.deleteRdb();
- });
- }
- .justifyContent(FlexAlign.Center)
- .width('100%')
- .height('100%');
- }
-
- private deleteRdb() {
- relationalStore.deleteRdbStore(this.context, this.storeConfig).then(() => {
-
-
- this.store = undefined;
- this.promptAction.showToast({ message: `删除数据库成功` });
- console.info('Delete RdbStore successfully.');
- }).catch((err: BusinessError) => {
- console.error(`Delete RdbStore failed, code is ${err.code},message is ${err.message}`);
- });
- }
-
- saveRawFileToSandbox(rawfilePath: string, dbFileDir: string, dbFileName: string) {
- let destFile: fileIo.File | undefined = undefined;
- try {
-
-
- const srcFile = this.resManage.getRawFdSync(rawfilePath);
-
-
- if (!fileIo.accessSync(dbFileDir)) {
- console.info(`沙箱路径【${dbFileDir}】不存在,开始创建目录。`);
- fileIo.mkdirSync(dbFileDir, true);
- }
- let dbFilePath = `${dbFileDir}/${dbFileName}`;
- destFile = fileIo.openSync(dbFilePath, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
- this.copyFile(srcFile.fd, srcFile.offset, destFile);
- console.info(`拷贝rawfile目录下预置的数据库文件到沙箱成功!`);
- } catch (err) {
- this.promptAction.showToast({ message: `拷贝数据库文件到沙箱失败` });
- console.error(`拷贝rawfile目录下预置的数据库文件到沙箱失败, code is ${err.code},message is ${err.message}`);
- } finally {
- if (rawfilePath) {
- this.resManage.closeRawFdSync(rawfilePath);
- }
- if (destFile) {
- fileIo.closeSync(destFile);
- }
- }
- }
-
- copyFile(fd: number, currentOffset: number, destFile: fileIo.File) {
-
- let bufferSize = 30000;
- let buffer = new ArrayBuffer(bufferSize);
-
-
- let readOption: ReadOptions = {
- offset: currentOffset,
- length: bufferSize
- };
-
- while (true) {
-
- let readLength = fileIo.readSync(fd, buffer, readOption);
-
- fileIo.writeSync(destFile.fd, buffer, { length: readLength });
-
-
- if (readLength < bufferSize) {
- break;
- }
- if (readOption.offset != undefined) {
- readOption.offset += readLength;
- }
- }
- }
-
- saveResFileToSandbox(resfilePath: string, dbFileDir: string, dbFileName: string) {
- let srcFile: fileIo.File | undefined = undefined;
- let destFile: fileIo.File | undefined = undefined;
- try {
-
-
- srcFile = fileIo.openSync(resfilePath, fileIo.OpenMode.READ_ONLY);
-
-
- if (!fileIo.accessSync(dbFileDir)) {
- console.info(`沙箱路径【${dbFileDir}】不存在,开始创建目录。`);
- fileIo.mkdirSync(dbFileDir, true);
- }
- let dbFilePath = `${dbFileDir}/${dbFileName}`;
- destFile = fileIo.openSync(dbFilePath, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);
- this.copyFile(srcFile.fd, 0, destFile);
- console.info(`拷贝resfile目录下预置的数据库文件到沙箱成功!`);
- } catch (err) {
- this.promptAction.showToast({ message: `拷贝数据库文件到沙箱失败` });
- console.error(`拷贝resfile目录下预置的数据库文件到沙箱失败, code is ${err.code},message is ${err.message}`);
- } finally {
- if (srcFile) {
- fileIo.closeSync(srcFile);
- }
- if (destFile) {
- fileIo.closeSync(destFile);
- }
- }
- }
-
- initDataBaseDir() {
- try {
- relationalStore.getRdbStore(this.context, this.storeConfig)
- .then(async (rdbStore: relationalStore.RdbStore) => {
- this.store = rdbStore;
- console.info('Get RdbStore successfully.');
-
- this.operateRdb();
- })
- .catch((err: BusinessError) => {
- this.promptAction.showToast({ message: `打开数据库失败` });
- console.error(`Get RdbStore failed, code is ${err.code},message is ${err.message}`);
- });
- } catch (err) {
- this.promptAction.showToast({ message: `打开数据库失败` });
- console.error(`initDataBaseDir failed, code is ${err.code},message is ${err.message}`);
- }
- }
-
- operateRdb() {
- if (!this.store) {
- console.error('RdbStore is undefined.');
- return;
- }
- try {
-
-
- const valueBucket: relationalStore.ValuesBucket = {
- 'NAME': 'rdbTest',
- 'AGE': 10,
- };
- let rowId: number = this.store.insertSync(this.tableName, valueBucket);
- console.info(`Insert is successful, rowId = ${rowId}`);
-
- let resultSet = this.store.querySqlSync(`SELECT * FROM ${this.tableName} limit 10`);
- console.info(`ResultSet column names: ${resultSet.columnNames}, row count: ${resultSet.rowCount}`);
- if (resultSet.rowCount > 0) {
- resultSet.getRows(resultSet.rowCount).then((rows: Array<relationalStore.ValuesBucket>) => {
- console.info(`querySqlSync successful rows = ${JSON.stringify(rows)}`);
- this.promptAction.showToast({ message: `查询数据库成功,查询结果:${rows.length}` });
- }).catch((err: BusinessError) => {
- console.error(`querySqlSync failed, code is ${err.code},message is ${err.message}`);
- }).finally(() => {
- resultSet.close();
- });
- } else {
- resultSet.close();
- }
- } catch (err) {
- console.error(`operateRdb failed, code is ${err.code},message is ${err.message}`);
- }
- }
- }