HarmonyOS 鸿蒙Next 已有一个db数据库,能否启动应用时通过relationalStore去读取

发布于 1周前 作者 bupafengyu 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 已有一个db数据库,能否启动应用时通过relationalStore去读取

已有一个数据库,存放应用所有的数据信息,我需要启动应用时去读取,再加载页面
目前我将数据库拷贝到ApplicationContext.databaseDir路径下,通过relationalStore读取时始终无法读取到,请问一下,ApplicationContext.databaseDir路径下的db文件,应该如何读取、查询?

2 回复

根据Stage模型概念图:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/stage-model-development-overview-V5

hap是和AbilityStage一一对应,实际resourceDir存储也可hap有关,实际resourceDir路径获取可以通过AbilityStageContext获取,abilityStage创建可以参考文档:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/abilitystage-V5

Application属于整个app,会包含多个hap包的情况,通过ApplicationContext获取会不合适。

数据库文件必须放在沙箱路径的/data/app/el2/100/database/<bundleName>/entry/rdb/下或其子目录下。

数据库,请参考https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-data-relationalstore-V5

参考代码:

将rawfile目录下db文件拷贝至数据库存储沙箱路径

saveFileToCache(file:resourceManager.RawFileDescriptor, 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:ReadOptions = {
    offset: currentOffset, //期望读取文件的位置。可选,默认从当前位置开始读
    length: bufferSize //每次期望读取数据的长度。可选,默认缓冲区长度
  }
  // 后面len会一直减,直到没有

while(true) { // 读取buffer容量的内容 let readLength = fs.readSync(file.fd, buffer, readOption); // 写入buffer容量的内容 fs.writeSync(cacheFile.fd, buffer, {length:readLength}) //写到cacheFile里 // 判断后续内容 修改读文件的参数 // buffer没读满代表文件读完了 if (readLength < bufferSize) { break; } if (readOption.offset != undefined){ readOption.offset += readLength; } } console.log(“Copy Success!!!”) fs.close(cacheFile); }

INIT() { // 创建数据库沙箱目录 try { let dirPath = getContext(this).getApplicationContext().databaseDir + “/entry” fs.mkdirSync(dirPath); dirPath = dirPath + “/rdb” fs.mkdirSync(dirPath); }catch (error) { console.error(mkdir rdbPath failed, error code: ${error.code}, message: ${error.message}.) }; //数据库名称 let dbName:string = ‘Company.db’ //读取rawfile目录下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()) this.saveFileToCache(value, dbName) } }); } catch (error) { console.error(callback getRawFd failed, error code: ${error.code}, message: ${error.message}.) }; }

参考fs文件管理:https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-file-fs-V5

场景一代码开发步骤:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/data-persistence-by-rdb-store-V5

更多关于HarmonyOS 鸿蒙Next 已有一个db数据库,能否启动应用时通过relationalStore去读取的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


HarmonyOS 鸿蒙Next 系统中,如果已存在一个db数据库,是可以在应用启动时通过relationalStore去读取的。relationalStore是鸿蒙系统提供的一种关系型数据存储能力,支持SQL查询和事务处理,适用于结构化数据的存储和读取。

具体实现步骤包括:

  1. 初始化RelationalDatabase:在应用启动时,通过RelationalDatabaseFactory获取或创建RelationalDatabase实例。

  2. 打开数据库:使用RelationalDatabase实例的openDatabase方法,传入数据库名称和配置,打开已存在的数据库。

  3. 获取RelationalStore:通过RelationalDatabase实例的getRelationalStore方法,传入表名,获取对应表的RelationalStore实例。

  4. 执行查询:使用RelationalStore实例提供的查询方法,如query,执行SQL查询语句,读取数据。

确保在操作过程中处理好异常和资源释放,以避免潜在的内存泄漏或数据库损坏问题。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部