鸿蒙加载预置数据库-关系型数据库-如何读取本地/预制数据库

参考文章如下

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

案例下载
加载预置数据库刷新文章列表

保存数据库到沙箱

ts 复制代码
 function saveFileToCache(file: resourceManager.RawFileDescriptor, dbName: string, context: UIContext,
  bufferSize: number) {
  // let context = AppStorage.get("context") as UIContext;
  let RDBDirectory = context.getHostContext()!.databaseDir;

  // 创建缓存文件(当前是覆盖式创建)
  let cFile = RDBDirectory + '/customDir/rdb/' + dbName;
  let cacheFile = fileIo.openSync(cFile, fileIo.OpenMode.READ_WRITE | fileIo.OpenMode.CREATE);

  // 读取缓冲区大小
  let buffer = new ArrayBuffer(bufferSize); //创建buffer缓冲区

  // 要copy的文件的offset
  let currentOffset = file.offset;

  let readOption: ReadOptions = {
    offset: currentOffset, //期望读取文件的位置。可选,默认从当前位置开始读
    length: bufferSize //每次期望读取数据的长度。可选,默认缓冲区长度
  };

  // 后面len会一直减,直到没有
  while (true) {
    // 读取buffer容量的内容
    let readLength = fileIo.readSync(file.fd, buffer, readOption);
    // 写入buffer容量的内容
    fileIo.writeSync(cacheFile.fd, buffer, { length: readLength }); //写到cacheFile里
    // 判断后续内容 修改读文件的参数
    // buffer没读满代表文件读完了
    if (readLength < bufferSize) {
      break;
    }
    if (readOption.offset != undefined) {
      readOption.offset += readLength;
    }
  }
  console.log('Copy Success!!!')
  fileIo.close(cacheFile);
}

async function INIT(context: UIContext, dbName: string, bufferSize: number) {

  let RDBDirectory = context.getHostContext()!.databaseDir;
  let resource = context.getHostContext()!.resourceManager;

  // 创建数据库沙箱目录
  try {
    let dirPath = RDBDirectory + '/customDir';
    fileIo.mkdirSync(dirPath);
    dirPath = dirPath + '/rdb';
    fileIo.mkdirSync(dirPath);
  } catch (error) {
    console.error(`mkdir rdbPath failed, error code: ${error.code}, message: ${error.message}.`);
  }

  //数据库名称传进来

  //读取rawfile目录下db文件
  try {
    const value: resourceManager.RawFileDescriptor = await resource.getRawFd('rdb/' + dbName)
    saveFileToCache(value, dbName, context, bufferSize);
  } catch (error) {
    console.error(`callback getRawFd failed, error code: ${error.code}, message: ${error.message}.`);
  }
}

预制数据库的读取封装

ts 复制代码
export async function getRDB(context: UIContext, name: string,customDir:string): Promise<relationalStore.RdbStore | undefined> {
  const RDBDirectory = context.getHostContext()!.databaseDir;
  console.log('RDBDirectory', RDBDirectory)
  let store: relationalStore.RdbStore | undefined = undefined;
  const STORE_CONFIG: relationalStore.StoreConfig = {
    name,
    securityLevel: relationalStore.SecurityLevel.S1,
    customDir
  };
  try {
    await relationalStore.getRdbStore(context.getHostContext(), STORE_CONFIG)
      .then(async (rdbStore: relationalStore.RdbStore) => {
        store = rdbStore;

      })
      .catch((err: BusinessError) => {
        console.error(`Get RdbStore failed, code is ${err.code},message is ${err.message}`);
      });
    return store
  } catch (e) {
    console.info(`errorgetRsssssssss${e}`);
    return undefined
  }
}

使用

复制代码
// 插入沙箱,/data/app/el2/100/database/com.***.***/customDir/rdb
  await INIT(context, 'book.db', 10224 * 1024)   
  
// 获取沙箱的数据库或者自己创建的关系型数据库
 await getRDB(context, 'jiongji100_dictionary.db','../customDir/rdb')
相关推荐
胖头鱼的鱼缸(尹海文)2 分钟前
数据库管理-第349期 Oracle DB 23.9新特性一览(20250717)
数据库·oracle
云盾安全防护1 小时前
WAF能够解决数据库被渗透的问题吗?
网络·数据库
运维栈记2 小时前
CPython的全局解释器锁-GIL即将成为历史
java·开发语言·数据库
未来并未来2 小时前
深入理解 Redis 集群化看门狗机制:原理、实践与风险
数据库·redis·缓存
yBmZlQzJ2 小时前
第5天 | openGauss中一个用户可以访问多个数据库
数据库·opengauss
lilyssh2 小时前
在分布式系统中,如何保证缓存与数据库的数据一致性?
数据库·缓存
智象科技3 小时前
智象科技赋能金融、证券行业 IT 运维
大数据·运维·网络·数据库·科技·金融·智能运维
缘来如此҉4 小时前
Mysql数据库——增删改查CRUD
数据库·mysql·oracle
zhanshuo4 小时前
干掉复杂逻辑!手把手教你在鸿蒙系统中创建稳定的后台服务
harmonyos
zhanshuo4 小时前
鸿蒙系统通知开发全攻略:实现跳转、自动消失、消息提醒的完整教程
harmonyos