HarmonyOS鸿蒙Next中Interface (RdbStore)支持读取沙箱目录下的.mbtiles文件吗?

HarmonyOS鸿蒙Next中Interface (RdbStore)支持读取沙箱目录下的.mbtiles文件吗? 我是用uniapp-x混合开发的。

目前我去使用Interface (RdbStore)接口去读取.mbtiles文件,.mbtiles文件已经放在了应用的沙箱路径中。

但是我使用RdbStore去读取database目录下的mbtiles文件 读取不到内容,dbStore.query(new relationalStore.RdbPredicates(“tiles”)) ,返回的结果:

cke_5581.png

res.rowCount=-1,res.goToFirstRow() 和 res.goToNextRow()返回结果都是falis。

是因为这个接口无法读取.mbtiles文件吗?我应该怎么读取.mbtiles文件呢?


更多关于HarmonyOS鸿蒙Next中Interface (RdbStore)支持读取沙箱目录下的.mbtiles文件吗?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

【解决方案】

RdbStore支持读取沙箱目录下的.mbtiles文件,无法读取可能有:

  1. 文件路径不正确、文件不存在。
  2. 文件损坏。
  3. 查询条件导致结果集为空。

请检查文件路径是否正确、文件是否存在、文件是否损坏以及查询条件是否正常,开发时可使用Device File Browser选择sanbox view模式(应用沙箱视图)查看沙箱文件。

参考代码如下:

// \uni-app-x工程目录\pages\index\index.uvue
<template>
  <view>
    <text>{{ title }}</text>
    <button @click="downloadFile">点击下载</button>
    <button @click="queryDatabase">点击查询</button>
  </view>
</template>

<script>
  import { saveFileToSandbox, query } from "../../uni_modules/lsk-rdb"
  export default {
    data() {
      return {
        title: 'Hello'
      }
    },
    methods: {
      downloadFile() {
        try {
          uni.showLoading();
          uni.downloadFile({
            url: ".mbtiles文件地址",
            success: (res) => {
              console.info(res.tempFilePath)
              saveFileToSandbox(res.tempFilePath)
            },
            fail: (err) => {
              console.info('downloadFile fail, err is:', err)
            },
            complete: (res) => {
              uni.hideLoading();
            }
          });
        } catch (error) {
          console.error(error)
        }
      },
      queryDatabase() {
        query()
      }
    }
  }
</script>
// \uni-app-x工程目录\uni_modules\lsk-rdb\utssdk\app-harmony\index.uts
import { fileIo as fs } from '@kit.CoreFileKit';
import { relationalStore } from '@kit.ArkData';

export function initDataBaseDir() {
  let dirPath = getContext().getApplicationContext().databaseDir + "/entry";
  // 创建数据库沙箱目录
  try {
    if (!fs.accessSync(dirPath)) {
      fs.mkdirSync(dirPath);
    }
  } catch (error) {
    console.error('init entry dir err');
  }
  dirPath = dirPath + '/rdb'
  try {
    if (!fs.accessSync(dirPath)) {
      fs.mkdirSync(dirPath);
    }
  } catch (error) {
    console.error('init rdb dir err');
  }
}

export function saveFileToSandbox(path : string) {
  initDataBaseDir();
  // 数据库名称
  let dbName = 'world_cities.mbtiles'
  let targetFileUrl = getContext().getApplicationContext().databaseDir + "/entry/rdb/" + dbName;
  let file = fs.openSync(path, fs.OpenMode.READ_ONLY)
  fs.copyFile(file.fd, targetFileUrl).then(() => {
    console.info("Succeeded in copying.");
  }).catch((err : any) => {
    console.error("Failed in copying.");
    console.error(err);
  }).finally(() => {
    fs.closeSync(file)
  })

}

export async function query() {
  let store : relationalStore.RdbStore | undefined = undefined;
  const STORE_CONFIG : relationalStore.StoreConfig = {
    name: 'world_cities.mbtiles',
    securityLevel: relationalStore.SecurityLevel.S1
  };
  store = await relationalStore.getRdbStore(getContext(), STORE_CONFIG);
  let predicates = new relationalStore.RdbPredicates("tiles");
  let resultSet = await store.query(predicates, ['zoom_level', 'tile_column', 'tile_row', 'tile_data']);
  console.info(resultSet.columnNames.join())
  // resultSet是一个数据集合的游标,默认指向第-1个记录,有效的数据从0开始。
  while (resultSet.goToNextRow()) {
    const zoom_level = resultSet.getLong(resultSet.getColumnIndex("zoom_level"));
    const tile_column = resultSet.getLong(resultSet.getColumnIndex("tile_column"));
    const tile_row = resultSet.getLong(resultSet.getColumnIndex("tile_row"));
    const tile_data = resultSet.getBlob(resultSet.getColumnIndex("tile_data"));
    console.info(`查询结果:zoom_level=${zoom_level}, tile_column=${tile_column}, tile_row=${tile_row}, tile_data=${tile_data}`);
  }
}

更多关于HarmonyOS鸿蒙Next中Interface (RdbStore)支持读取沙箱目录下的.mbtiles文件吗?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,RdbStore接口主要用于关系型数据库操作,不支持直接读取或解析.mbtiles文件格式。.mbtiles是SQLite数据库的一种特定格式,存储地图切片数据。若需访问此类文件,需通过鸿蒙的文件API读取沙箱路径,再使用SQLite操作库解析内容,但RdbStore不包含该功能。

RdbStore接口主要用于关系型数据库操作,而.mbtiles是SQLite格式的瓦片数据文件,理论上可以通过RdbStore访问。但出现rowCount=-1通常表明查询未找到匹配记录或表不存在。

建议按以下步骤排查:

  1. 确认文件路径正确且数据库已成功打开
  2. 使用RdbStore的attach()方法附加外部数据库文件
  3. 直接执行SQL查询验证表结构:SELECT * FROM sqlite_master WHERE type=‘table’
  4. 检查.mbtiles文件完整性,标准应包含tiles、metadata等表

若仍无法读取,可能需要通过文件接口直接访问SQLite数据库文件。

回到顶部