HarmonyOS鸿蒙Next中如何在ArkTS中实现访问本地已有的SQLite数据库文件

HarmonyOS鸿蒙Next中如何在ArkTS中实现访问本地已有的SQLite数据库文件 ArkTS如何实现访问本地已有的SQLite数据库文件,求助详细~~~

3 回复

一、场景

读取本地已有数据的db文件

二、步骤

将sqlite的数据库文件拷贝至关系型数据库的沙箱目录 -> 通过relational的api获取数据库store -> 读取数据库

三、相关知识点

  1. 将预制的数据库,放在db文件的存在目录,保证文件的权限、属主正确,是可以正常访问的。

  2. 关系型数据库存储沙箱路径/data/app/el2/100/database/(bundleName)/entry/rdb/下的.db文件

四、主要代码

拷贝rawfile数据库文件至沙箱路径

saveFileToCache(file, dbName:string) {
    // 创建缓存文件(当前是覆盖式创建)

    let cFile = getContext(this).getApplicationContext().databaseDir + "/entry/rdb/" + dbName
    let cacheFile = fs.openSync(cFile,  fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)
    // 读取缓冲区大小
    let bufferSize = 30000
    let buffer = new ArrayBuffer(bufferSize); //创建buffer缓冲区
    // 要copy的文件的offset和length
    let currentOffset = file.offset;
    let lengthNeedToReed = file.length;
    let readOption = {
      offset: currentOffset, //期望读取文件的位置。可选,默认从当前位置开始读
      length: bufferSize //每次期望读取数据的长度。可选,默认缓冲区长度
    }
    // 后面len会一直减,直到没有
    while(true) {
      // 读取buffer容量的内容
      let readLength = fs.readSync(file.fd, buffer, readOption);
      console.info("123")
      // 写入buffer容量的内容
      fs.writeSync(cacheFile.fd, buffer, {length:readLength}) //写到cacheFile里
      // 判断后续内容 修改读文件的参数
      // buffer没读满代表文件读完了
      if (readLength < bufferSize) {
        break;
      }
      readOption.offset += readLength;
    }
    console.log("Copy Success!!!")
    fs.close(cacheFile);
    // 展示cache目录下的文件名
    // this.cacheDirFileList = fs.listFileSync(getContext(this).cacheDir);
  }

  aboutToAppear(){
    // this.companyDB.GetCompanyStore();
    let dirPath = getContext(this).getApplicationContext().databaseDir + "/entry"
    fs.mkdirSync(dirPath);
    dirPath = dirPath + "/rdb"
    fs.mkdirSync(dirPath);

    let dbName:string = 'muapp.db'

    try {
      getContext(this).resourceManager.getRawFd('rdb/' + dbName, (error, value) => {
        if (error != null) {
          console.log(`callback getRawFd failed error code: ${error.code}, message: ${error.message}.`);
        } else {
          console.info(value.length.toString() + "DWSD")
          this.saveFileToCache(value, dbName)
        }
      });
    } catch (error) {
      console.error(`callback getRawFd failed, error code: ${error.code}, message: ${error.message}.`)
    };

  }

获取数据库实例

GetCompanyStore(){
    // 获取store实例
    const STORE_CONFIG = {
      name: 'Company.db',
      securityLevel:relationalStore.SecurityLevel.S1
    } ;
    relationalStore.getRdbStore(this.context,STORE_CONFIG,(err,store) => {
      if (err) {
        console.error(`Failed to get RdbStore. Code:${err.code}, message:${err.message}`);
        return;
      }else{
        console.info(`Succeeded in getting RdbStore.`);
      }
      this.rdbStore=store;
    })
  }

更多关于HarmonyOS鸿蒙Next中如何在ArkTS中实现访问本地已有的SQLite数据库文件的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


老哥,这个将文件拷贝到沙箱的代码具体该如何使用呢
具体有哪些是在自己本地需要改动的地方呢

在HarmonyOS鸿蒙Next中,使用ArkTS访问本地SQLite数据库文件可以通过@ohos.data.relationalStore模块实现。首先,使用getRdbStore方法获取数据库实例,指定数据库路径和配置。然后,通过executeSqlquery方法执行SQL语句或查询数据。确保数据库文件已放置在应用的/data/storage/el2/base/database/目录下,并在config.json中声明ohos.permission.READ_USER_STORAGE权限。

回到顶部