Sqlite数据库文件拷贝到沙箱目录下,然后通过数据库的api来读取数据

Sqlite数据库文件拷贝到沙箱目录下,然后通过数据库的api来读取数据

HarmonyOS
2024-05-22 23:19:32
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
人提唱盘

一、场景

读取本地已有数据的db文件

二、步骤

将sqlite的数据库文件拷贝至关系型数据库的沙箱目录 -> 通过relational的api获取数据库store -> 读取数据库

三、相关知识点

1. 将预制的数据库,放在db文件的存在目录,保证文件的权限、属主正确,是可以正常访问的。

2. 关系型数据库存储沙箱路径/data/app/el2/100/database/(bundleName)/entry/rdb/下的.db文件

四、主要代码

拷贝rawfile数据库文件至沙箱路径

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); 
  // 展示cache目录下的文件名 
  // this.cacheDirFileList = fs.listFileSync(getContext(this).cacheDir); 
} 
INIT(){ 
  // this.companyDB.GetCompanyStore(); 
  let dirPath = getContext(this).getApplicationContext().databaseDir + "/entry" 
  fs.mkdirSync(dirPath); 
  dirPath = dirPath + "/rdb" 
  fs.mkdirSync(dirPath); 
  let dbName:string = 'Company.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}.`) 
  }; 
} 
 

获取数据库实例

GetCompanyStore(){ 
  // 获取store实例 
  console.info(`Succeeded`); 
  const STORE_CONFIG :relationalStore.StoreConfig = { 
    name: 'Company.db', 
    securityLevel:relationalStore.SecurityLevel.S1 
  } ; 
  relationalStore.getRdbStore(this.context,STORE_CONFIG,(err,store) => { 
    if (err) { 
      console.error(`Failed to get RdbStore. Code:${err.code}, message:${err.message}`); 
      return; 
    }else{ 
        console.info(`Succeeded in getting RdbStore.`); 
    } 
    this.rdbStore=store; 
  }) 
}
分享
微博
QQ
微信
回复
2024-05-23 18:13:40
相关问题
HarmonyOS 数据库拷贝后无法读取
274浏览 • 1回复 待解决
App Sqlite 数据库初使化数据文件
234浏览 • 1回复 待解决
sqlite数据库设置密钥问题
261浏览 • 1回复 待解决
HarmonyOS 打开下载Sqlite数据库
0浏览 • 1回复 待解决
如何查看模拟器设备数据库文件
1494浏览 • 1回复 待解决
SQLite数据库和MYSQL哪个更好用
2723浏览 • 2回复 已解决
如何导出设备中数据库文件并查看
2509浏览 • 1回复 待解决
SQLite数据库和MYSQL哪个更好用
3304浏览 • 1回复 已解决
如何读取本地/预制数据库
1213浏览 • 1回复 待解决
如何将easymock数据插入数据库
2447浏览 • 1回复 待解决
关系数据库无法拷贝怎么回事?
2026浏览 • 1回复 待解决
如何将PixelMap数据存储数据库
1891浏览 • 1回复 待解决