HarmonyOS db文件无法读取到数据

db文件中的数据无法读取,resultSet读取的结果是ResultSet column names: , column count: 0

try{ 
  let context = getContext(this) 
  const STORE_CONFIG :relationalStore.StoreConfig= { 
    name: name, // 数据库文件名 
    securityLevel: relationalStore.SecurityLevel.S4, // 数据库安全级别 
    encrypt: false, // 可选参数,指定数据库是否加密,默认不加密 
  }; 
  relationalStore.getRdbStore(context, STORE_CONFIG, (err, store) => { 
    if (err) { 
      console.error(`Failed to get RdbStore. Code:${err.code}, message:${err.message}`); 
      return; 
    } 
    console.info('Succeeded in getting RdbStore.'); 
    let predicates = new relationalStore.RdbPredicates('SYS_DICT') 
    let names = Array<string>() 
    if (store != undefined) { 
      store.query(predicates, [], (error: BusinessError, resultSet) => { 
        if (error) { 
          console.error(`Failed to get RdbStore. Code:${error.code}, message:${error.message}`); 
          return; 
        } 
        let log = `ResultSet column names: ${resultSet.columnNames}, column count: ${resultSet.columnCount}` 
        console.info(log); 
 
        // resultSet是一个数据集合的游标,默认指向第-1个记录,有效的数据从0开始。 
        while (resultSet.goToNextRow()) { 
 
          let result = '' 
          for (let index = 0; index < resultSet.columnNames.length; index++) { 
            const element = resultSet.columnNames[index]; 
            const name = resultSet.getString(resultSet.getColumnIndex(element)); 
            result += `${element}=${name};` 
          } 
          names.push(result) 
        } 
        if (names.length > 0) { 
          this.content = names.join('\n') 
        } 
        // 释放数据集的内存 
        resultSet.close(); 
      }) 
    } 
  }) 
} catch(error) { 
  console.error(error) 
}
HarmonyOS
2024-08-02 15:48:23
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
彩云汽泡泡

目前不支持直接访问其他路径下的.db文件,目前可提供的方案是将数据库.db文件复制到数据库存储沙箱路径,然后进行查询操作。

可以参考这个init方法将rawfile中的.db文件复制到数据库存储沙箱路径,当前示例中Company.db所在目录为/rawfile/rdb/Company.db

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

这是init方法中的 saveFileToCache(value, dbName)方法

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); 
}
分享
微博
QQ
微信
回复
2024-08-02 21:49:19
相关问题
无法读取到hsp模块中的rawfile文件
1809浏览 • 1回复 待解决
HarmonyOS 数据库拷贝后无法读取
147浏览 • 1回复 待解决
读取数据文件的方法有哪些
272浏览 • 1回复 待解决
HarmonyOS如何读取文件
416浏览 • 1回复 待解决
HarmonyOS 读取raw文件参考示例
386浏览 • 1回复 待解决
HarmonyOS 文件上传 & 资源读取问题
361浏览 • 1回复 待解决
HarmonyOS fs模块读取文件的问题
417浏览 • 1回复 待解决
HarmonyOS项目中json文件文本读取
675浏览 • 1回复 待解决
如何读取本地JSON文件
2043浏览 • 1回复 待解决
HarmonyOS 如何读取网页中标签数据
106浏览 • 1回复 待解决
如何根据uri读取文件?
2967浏览 • 1回复 待解决
HarmonyOS 配置文件中metadata如何读取
149浏览 • 1回复 待解决