【鸿蒙ArkTs】沙箱内sqlite数据库db文件导入导出

1.数据库在沙箱内位置

沙箱文件目录 官方文档说明

获取数据库路径:

let 数据库路径='/data/storage/el2/database/entry/rdb/Mydata.db'

2.数据库临时文件

找到了数据库db文件,只导出这个db文件是没有用的。因为还有db-wal这个临时文件。系统并没有把数据全部写入db,甚至重启手机也不行。

3.备份数据库

ArkTs提供了关系数据库的备份功能,能够将所有数据备份到备份数据库中,这样就可以曲线救国了。

  /*
   * 数据库备份
   */
  备份(){
    this.数据库.backup('备份Mydata.db')
  }

  /*
   * 数据库恢复
   */
  恢复(){
    this.数据库.restore('备份Mydata.db')
  }

4.导出沙箱文件到用户文件夹

import RDB from '../RDB' //自己编写的数据库模块
import picker from '@ohos.file.picker'; //用于打开文件选择器
import fs from '@ohos.file.fs'; //文件拷贝用

@Entry
@Component
struct 获取文件{

  async 导出(){
    RDB.备份() //先进行备份获得全部数据,文件名固定为'备份Mydata.db'

    try {
      let 数据库文件='/data/storage/el2/database/entry/rdb/备份Mydata.db'
      
      //用文件选择器选择用户区目录和文件名进行保存
      let 文件保存选项= new picker.DocumentSaveOptions();
      
      //写好默认的文件名,如果存在同名文件,系统拷贝时会自动重命名
      文件保存选项.newFileNames = ['备份Mydata.db'];

      let 文件选择器= new picker.DocumentViewPicker();
      文件选择器.save(文件保存选项).then((保存文件结果: Array<string>) => {

        let 目标uri=保存文件结果[0]

        let 目标文件=fs.openSync(目标uri, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE)

        fs.copyFile(数据库文件,目标文件.fd,).then(()=>{
          //拷贝成功后关闭文件
          fs.closeSync(目标文件.fd) 
        }).catch((err)=>{
          console.error('xxx','拷贝文件失败: ' , err.message , err.code)
        })

      }).catch((err) => {
        console.error('xxx','DocumentViewPicker.save错误: ' + JSON.stringify(err));
      });
    } catch (error) {
      let err = error;
      console.error('xxx','DocumentViewPicker错误: ' + JSON.stringify(err));
    }
  }
}

5.导入数据库

  async 导入(){

    try {
      //不管从文件选择器中选择的文件名是什么,拷贝过来都固定为'备份Mydata.db'
      let 目标文件='/data/storage/el2/database/entry/rdb/备份Mydata.db'

      let 文件打开选项 = new picker.DocumentSelectOptions()
      let 文件选择器 = new picker.DocumentViewPicker();
      文件选择器.select(文件打开选项).then((选择文件: Array<string>) => {
        let 来源uri=选择文件[0]

        let 来源文件=fs.openSync(来源uri, fs.OpenMode.READ_ONLY)

        fs.copyFile(来源文件.fd,目标文件).then(()=>{
          fs.closeSync(来源文件.fd)

          //从导入的文件'备份Mydata.db'恢复到数据库文件Mydata.db
          RDB.恢复()
        }).catch((err)=>{
          console.error('xxx','导入文件失败: ' + err.message + ', error code: ' + err.code)
        })

      }).catch((err) => {
        console.error('xxx','DocumentViewPicker.select错误: ' + JSON.stringify(err));
      });
    } catch (error) {
      let err = error;
      console.error('xxx','DocumentViewPicker错误: ' + JSON.stringify(err));
    }
  }

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值