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

【HarmonyOS鸿蒙Next 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));

  }
}

更多关于【HarmonyOS鸿蒙Next ArkTs】沙箱内sqlite数据库db文件导入导出的实战教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

看了你的方法试了有问题,正困扰我,

官方的方法能不能解答一下

https://developer.huawei.com/consumer/cn/forum/topic/0208145884137328155?fid=0101587866109860105

更多关于【HarmonyOS鸿蒙Next ArkTs】沙箱内sqlite数据库db文件导入导出的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


Mark一下,有个问题,数据库文件地址能直接用context.databaseDir+数据库名吗?

思路有用,万千围堵中一条生路:)

姓名:张三 职位:软件工程师 简介:拥有5年软件开发经验,熟悉Java和Python。

整理非常清晰,很有价值!

哈哈🤝,

基本信息
姓名:张三
职位:软件工程师
简介:拥有超过10年的IT行业经验,擅长解决复杂问题。

在HarmonyOS鸿蒙Next中,使用ArkTs进行沙箱内SQLite数据库的db文件导入导出操作,可以通过以下方式实现:

导出db文件:

  • 使用ohos.data.relationalStore模块中的RdbStore类,通过backup方法将数据库文件备份到指定路径。
  • 示例代码:
    import relationalStore from '[@ohos](/user/ohos).data.relationalStore';
    let rdbStore: relationalStore.RdbStore;
    // 初始化RdbStore
    rdbStore.backup('backupPath', (err) => {
        if (err) {
            console.error(`Backup failed, err: ${err}`);
        } else {
            console.log('Backup succeeded');
        }
    });
    

导入db文件:

  • 使用ohos.data.relationalStore模块中的RdbStore类,通过restore方法将备份的数据库文件恢复到当前数据库。
  • 示例代码:
    import relationalStore from '[@ohos](/user/ohos).data.relationalStore';
    let rdbStore: relationalStore.RdbStore;
    // 初始化RdbStore
    rdbStore.restore('backupPath', (err) => {
        if (err) {
            console.error(`Restore failed, err: ${err}`);
        } else {
            console.log('Restore succeeded');
        }
    });
    

注意事项:

  • 确保备份路径和恢复路径的权限正确,避免文件操作失败。
  • 在导入导出过程中,数据库可能会被锁定,确保在操作期间没有其他数据库操作。

通过以上方法,可以在HarmonyOS鸿蒙Next中实现SQLite数据库文件的导入导出操作。

在HarmonyOS鸿蒙Next中使用ArkTS进行SQLite数据库的导入导出操作,可以通过以下步骤实现:

  1. 导出数据库:使用File类将数据库文件复制到指定路径。例如,将/data/data//databases/.db复制到外部存储。

  2. 导入数据库:同样使用File类将外部存储中的数据库文件复制回应用的数据库目录。

  3. 权限管理:确保应用具有读写外部存储的权限,可以通过ohos.permission.READ_MEDIAohos.permission.WRITE_MEDIA权限申请。

  4. 数据库操作:使用@ohos.data.relationalStore模块进行数据库的打开和操作。

通过这些步骤,可以实现SQLite数据库的导入导出功能。

回到顶部