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()获取备份目录,调用RdbStorebackup()执行备份操作。备份文件为数据库副本,存储在应用沙箱内,需通过文件管理API访问或迁移。

在HarmonyOS Next中,将应用沙箱内的关系型数据库(RDB)导出为本地文件,核心是使用ohos.data.relationalStoreohos.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格式文件。

回到顶部