HarmonyOS 鸿蒙Next 已有一个db数据库,能否启动应用时通过relationalStore去读取
HarmonyOS 鸿蒙Next 已有一个db数据库,能否启动应用时通过relationalStore去读取
目前我将数据库拷贝到ApplicationContext.databaseDir路径下,通过relationalStore读取时始终无法读取到,请问一下,ApplicationContext.databaseDir路径下的db文件,应该如何读取、查询?
根据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查询和事务处理,适用于结构化数据的存储和读取。
具体实现步骤包括:
-
初始化
RelationalDatabase
:在应用启动时,通过RelationalDatabaseFactory
获取或创建RelationalDatabase
实例。 -
打开数据库:使用
RelationalDatabase
实例的openDatabase
方法,传入数据库名称和配置,打开已存在的数据库。 -
获取
RelationalStore
:通过RelationalDatabase
实例的getRelationalStore
方法,传入表名,获取对应表的RelationalStore
实例。 -
执行查询:使用
RelationalStore
实例提供的查询方法,如query
,执行SQL查询语句,读取数据。
确保在操作过程中处理好异常和资源释放,以避免潜在的内存泄漏或数据库损坏问题。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html