HarmonyOS鸿蒙Next中关系型数据库导出到本地文件
HarmonyOS鸿蒙Next中关系型数据库导出到本地文件 应用内关系型数据库如何从应用沙箱中导出到本地文件,可否封装一个小工具用下。
5 回复
前几天才写的示例,可以参考下
import { fileIo, picker } from "@kit.CoreFileKit"
import { common } from "@kit.AbilityKit"
import { relationalStore } from "@kit.ArkData"
@Entry
export struct DatabaseTransfer{
databaseName:string="export.db"
build() {
Column(){
Button("导出").onClick(()=>{
this.exportDatabase()
})
}
}
exportDatabase() {
relationalStore.getRdbStore(this.getUIContext().getHostContext(),{
name: this.databaseName,
securityLevel: relationalStore.SecurityLevel.S1
}).then((rdbStore)=>{
let fileNames:Array<string> = [this.databaseName]
let documentPicker = new picker.DocumentViewPicker(this.getUIContext().getHostContext() as common.UIAbilityContext);
documentPicker.save({
newFileNames:fileNames,
pickerMode:picker.DocumentPickerMode.DEFAULT
}).then(async (uris)=> {
if(uris.length<=0){
return
}
let uri = uris[0]
let databaseUri = this.getUIContext().getHostContext()?.databaseDir+"/rdb/"+this.databaseName
console.log(`${databaseUri}`)
fileIo.open(databaseUri).then((sourceFile)=>{
fileIo.open(uri,fileIo.OpenMode.READ_WRITE).then((destFile)=>{
fileIo.copyFile(sourceFile.fd,destFile.fd).then(()=>{
console.log(`导出数据库文件成功`)
}).catch((err:BusinessError)=>{
console.log(`拷贝文件失败,错误码${err.code},错误信息:${err.message}`)
})
}).catch((err:BusinessError)=>{
console.log(`打开目标文件失败,错误码${err.code},错误信息:${err.message}`)
})
}).catch((err:BusinessError)=>{
console.log(`读取数据库文件失败,错误码${err.code},错误信息:${err.message}`)
})
}).catch((err:BusinessError)=>{
console.log(`调用文件管理器失败,错误码${err.code},错误信息:${err.message}`)
})
}).catch((err:BusinessError)=>{
console.log(`打开数据库文件失败,错误码${err.code},错误信息:${err.message}`)
})
}
}
更多关于HarmonyOS鸿蒙Next中关系型数据库导出到本地文件的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
我试了下这个导出来那个数据库里边没有数据,不知道哪里出问题了
刚才打开了一下,我导出的数据库是有数据的
在HarmonyOS Next中,使用关系型数据库(RDB)的backup()方法可将数据库备份到指定沙箱路径。通过getBackupPath()获取备份目录,调用RdbStore的backup()执行备份操作。备份文件为数据库副本,存储在应用沙箱内,需通过文件管理API访问或迁移。
在HarmonyOS Next中,将应用沙箱内的关系型数据库(RDB)导出为本地文件,核心是使用ohos.data.relationalStore与ohos.file.fs API进行跨沙箱的文件复制。以下是关键步骤和示例代码:
1. 获取数据库文件路径
首先通过RdbStore的上下文获取数据库在应用沙箱内的完整路径:
import relationalStore from '@ohos.data.relationalStore';
// 假设已初始化RdbStore实例为rdbStore
let dbPath: string = rdbStore.getPath();
// 返回示例:/data/app/.../com.example.app/database/test.db
2. 复制到公共目录
将数据库文件复制到公共下载目录(需申请权限):
import fs from '@ohos.file.fs';
import common from '@ohos.app.ability.common';
// 获取公共下载目录路径
let context: common.UIAbilityContext = getContext(this) as common.UIAbilityContext;
let publicDir = context.filesDir; // 或使用其他公共目录如媒体库
// 构造目标路径
let targetPath = publicDir + '/exported.db';
// 复制文件
try {
fs.copyFileSync(dbPath, targetPath);
console.log('导出成功:' + targetPath);
} catch (err) {
console.error('导出失败:' + JSON.stringify(err));
}
3. 封装工具函数
可封装为即用函数:
export async function exportRdbToFile(rdbStore: relationalStore.RdbStore,
fileName: string): Promise<string> {
const context = getContext(this) as common.UIAbilityContext;
const exportDir = context.filesDir + '/rdb_export/';
// 创建导出目录
if (!fs.accessSync(exportDir)) {
fs.mkdirSync(exportDir);
}
const srcPath = rdbStore.getPath();
const dstPath = exportDir + fileName;
try {
fs.copyFileSync(srcPath, dstPath);
return dstPath;
} catch (err) {
throw new Error(`导出失败: ${JSON.stringify(err)}`);
}
}
4. 权限配置
在module.json5中声明文件访问权限:
{
"module": {
"requestPermissions": [
{
"name": "ohos.permission.READ_MEDIA",
"reason": "导出数据库文件"
},
{
"name": "ohos.permission.WRITE_MEDIA",
"reason": "保存数据库文件"
}
]
}
}
注意事项:
- 导出操作建议在异步线程执行,避免阻塞UI。
- 目标路径可选择
Download目录(需使用@ohos.file.environment获取标准目录)。 - 大文件导出时需分片处理,避免内存溢出。
- 数据库在导出期间应避免写入操作,建议暂停事务或使用备份API。
此方案直接操作数据库文件,适用于完整数据库导出。若需导出特定表数据,建议通过查询接口获取数据后,使用@ohos.file.fileio写入JSON或CSV格式文件。

