如何读取本地/预制数据库?

根据已有的数据库文件(.db)创建数据库

HarmonyOS
2024-05-22 23:14:04
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
北风_小浦

将db文件推到数据存储沙箱路径:

/data/app/el2/100/database/(bundleName)/entry/rdb/下

场景一:db文件结构不一致,通过读库和写库的方式来处理:getRdbStore

需保证文件的权限、属主正确(文件没加密,可读可写)

场景二: db文件结构一致,可以利用数据库恢复的方式来创建数据库:restore

参考代码:

将rawfile目录下db文件拷贝至数据库存储沙箱路径

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); 
} 
  
INIT() { 
  // 创建数据库沙箱目录 
  try { 
    let dirPath = getContext(this).getApplicationContext().databaseDir + "/entry" 
    fs.mkdirSync(dirPath); 
    dirPath = dirPath + "/rdb" 
    fs.mkdirSync(dirPath); 
  }catch (error) { 
    console.error(`mkdir rdbPath failed, error code: ${error.code}, message: ${error.message}.`) 
  }; 
  
  //数据库名称 
  let dbName:string = 'Company.db' 
  
  //读取rawfile目录下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}.`) 
  }; 
}

场景一:getRdbStore读取创建数据库

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; 
})

场景二:restore数据库恢复方式创建数据库(已创建一致db结构的数据库)

// value:备份数据库名 
if(this.rdbStore){ 
  (this.rdbStore as relationalStore.RdbStore).restore(value, (err) => { 
    if (err) { 
      console.error(`Restore failed, code is ${err.code},message is ${err.message}`); 
      return;
分享
微博
QQ
微信
回复
2024-05-23 18:08:16
相关问题
HarmonyOS 数据库拷贝后无法读取
274浏览 • 1回复 待解决
如何连接PolarDB数据库集群 ?
4044浏览 • 1回复 待解决
RDS如何查看数据库名称?
2397浏览 • 1回复 待解决
如何读取本地JSON文件
2365浏览 • 1回复 待解决
OrmDatabase 数据库问题
3593浏览 • 1回复 待解决
HarmonyOS 数据库框架
395浏览 • 1回复 待解决
多个数据库,同步数据
1925浏览 • 1回复 待解决
ArkTS如何读取本地json?
7204浏览 • 1回复 待解决