HarmonyOS 鸿蒙Next中沙盒数据库路径的权限是怎么申请的?

HarmonyOS 鸿蒙Next中沙盒数据库路径的权限是怎么申请的? API 版本是17

已有一个sqlit3 的db文件。大约3000条数据。本身设想是APP启动后直接将此文件复制到 context.databaseDir目录下。之后,直接读取数据库即可。 启动时总是报错:

启动报错:
[sandbox_utils.cpp:344]errno is: 13, private mount to /mnt/sandbox/100/com.example.xhsy/data/service/el0/public/for-all-app '524288' failed
[sandbox_utils.cpp:328]mount /mnt/sandbox/100/com.example.xhsy/mnt/storage/Users time 2585 us
[sandbox_utils.cpp:328]mount /mnt/sandbox/100/com.example.xhsy/mnt/storage/Users time 2585 us
[sandbox_utils.cpp:328]mount /mnt/sandbox/100/com.example.xhsy/mnt/storage/hmdfs time 2399 us
[sandbox_dec.c:190]open dec file fail.
[appspawn_silk.c:118]Load silk library failed for configItems is NULL

初始化数据库代码,此代码是在 onWindowStageCreate 方法中调用。

  private async initDatabase(context: common.UIAbilityContext) {
    const dbName = 'xhsy.db';
    // 构建沙箱路径
    const dbPath = context.databaseDir + dbName;
    // if (!fileIo.accessSync(dbPath)) { 
    let resource = context.resourceManager;
    try {
      // 读取原始文件
      const rawContent = resource.getRawFileContentSync(dbName);
      // 写入沙箱
      const file = fileIo.openSync(dbPath, fileIo.OpenMode.CREATE);
      fileIo.write(file.fd, rawContent.buffer);
      fileIo.closeSync(file);
    } catch (error) {
      console.error(`DB迁移失败: ${error.message}`);
    }

还是说,不能直接复制文件到 databaseDr 下?只能 rdbStore开启数据库连接后,执行sql 进行插入?


更多关于HarmonyOS 鸿蒙Next中沙盒数据库路径的权限是怎么申请的?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

8 回复

权限配置

module.json5 中添加权限声明:

"requestPermissions": [

  { "name": "ohos.permission.READ_MEDIA" },

  { "name": "ohos.permission.WRITE_MEDIA" }

]

鸿蒙沙箱路径默认仅允许应用自身访问,无需额外申请存储权限,但需确保路径正确性。

使用沙箱内专用数据库目录:

const dbPath = context.databaseDir + '/rdb/xhsy.db'; // 确保路径包含rdb子目录

文件写入问题:

错误 private mount failed 由路径权限或同步IO阻塞引起,改用 异步API 写入文件:

try {

  const rawContent = await context.resourceManager.getRawFileContent(dbName);

  const file = await fileIo.open(dbPath, fileIo.OpenMode.CREATE | fileIo.OpenMode.READ_WRITE);

  await fileIo.write(file.fd, rawContent.buffer);

  await fileIo.close(file);

} catch (error) {

  console.error(`DB迁移失败: ${error.message}`);

}

SQLite在写入时可能生成 .db-wal 文件,需调用 checkpoint 确保数据完全落盘:

const rdbStore = await relationalStore.getRdbStore(context, {

  name: 'xhsy.db',

  securityLevel: relationalStore.SecurityLevel.S1

});

await rdbStore.checkpoint(); // 强制写入所有变更

更多关于HarmonyOS 鸿蒙Next中沙盒数据库路径的权限是怎么申请的?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


之前看报错,问AI,一直以为是权限问题,直到我新建了一个空项目,也报同样的错误。才发现跑偏了(也看见文档说不需要申请权限了)。 针对我提的这个问题,确实是文件写入同步的问题,添加 await 解决。也许要添加 /rdb/ 路径 感谢回复,

你调试一下,应该是这段,少了一个 /

const dbPath = context.databaseDir + dbName;

改成

const dbPath = context.databaseDir + ‘/’ +dbName;

麻了… 斜杠可能是少了,但是还是解决不了问题。

通过 relationalStore.getRdbStore 获取的数据库连接,似乎是系统自己创建的数据库文件,并没有使用我复制过去的文件…,

const dbPath = context.databaseDir + dbName;

改成

改成这样
const dbPath = context.databaseDir + '/rdb/' +dbName;

谢谢回复,根本问题是我文件写入的有问题。 感谢感谢~,

在HarmonyOS鸿蒙Next中,沙盒数据库路径位于应用沙箱目录内,无需额外申请权限。系统自动为每个应用分配独立数据存储空间,数据库文件默认存储在/data/storage/el2/database/路径下。应用可通过context.databaseDir获取该路径,直接进行数据库操作。所有数据访问受应用沙箱机制保护,其他应用无法访问。

在HarmonyOS Next(API 17)中,直接复制SQLite数据库文件到context.databaseDir目录是可行的,但需要注意权限和路径的正确性。根据错误日志,问题可能源于沙盒环境下的文件操作权限或路径挂载失败。

请确保:

  1. module.json5中声明必要的文件访问权限,例如ohos.permission.READ_MEDIAohos.permission.WRITE_MEDIA(若涉及外部存储)。
  2. 使用context.databaseDir获取应用沙盒内的数据库路径,该路径通常为/data/app/el2/100/base/<package-name>/database/,应用默认有读写权限。
  3. 检查源文件(xhsy.db)是否位于resources/rawfile/目录下,getRawFileContentSync仅能访问该位置。
  4. 避免在onWindowStageCreate中执行同步文件操作,建议使用异步方式或移至后台任务。

替代方案:如果文件复制持续失败,可以考虑使用RDB开放接口创建数据库并逐条插入数据,但这对于3000条数据可能效率较低。优先调试文件复制流程,确保路径和权限正确。

回到顶部