HarmonyOS鸿蒙Next中手机APP与外置OTG存储设备的通信,如何操作外置存储器中的sqlte数据库文件或进行文件的读写。

HarmonyOS鸿蒙Next中手机APP与外置OTG存储设备的通信,如何操作外置存储器中的sqlte数据库文件或进行文件的读写。 应用场景:我们的应用场景是手机内存不足的情况下,增加一个外置存储设备,里边存储模型文件、离线地图文件、结构化数据等, 业务操作时,直接操作外置储存设备中的文件,对其进行增删改查等操作。

手机APP与外置OTG存储设备的通信,如何操作外置存储器中的sqlte数据库文件或进行文件的读写?

2 回复

在HarmonyOS Next中,通过OTG连接外置存储设备后,使用@ohos.file.fs@ohos.file.storage模块进行文件操作。通过storage.getExternalStorage()获取外部存储目录,再使用fs.openSync()fs.readSync()/fs.writeSync()读写文件。对于SQLite数据库文件,需先将其复制到应用沙箱路径(如context.databaseDir)中,再使用@ohos.data.relationalStore模块的getRdbStore()创建或打开数据库进行操作。

更多关于HarmonyOS鸿蒙Next中手机APP与外置OTG存储设备的通信,如何操作外置存储器中的sqlte数据库文件或进行文件的读写。的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,操作通过OTG连接的外置存储设备(如U盘)上的文件或SQLite数据库,其核心在于获取该设备的文件系统访问权限和正确的文件路径。由于系统安全限制,应用不能直接无限制地访问外部存储,需要遵循特定的流程。

以下是关键步骤和操作方式的概述:

1. 获取外置存储设备的访问权限和根路径

这是操作的前提。HarmonyOS Next通过StorageManagerVolumeInfo来管理系统存储卷。

  • 动态发现设备:监听存储设备的挂载(volumeMounted)和卸载(volumeUnmounted)事件。当用户插入OTG设备后,系统会发出相应事件。
  • 获取VolumeInfo:通过StorageManagergetVolumes()方法获取当前所有存储卷的列表。外置OTG设备通常是一个VolumeInfo,其类型(getType())为VolumeInfo.TYPE_PUBLICVolumeInfo.TYPE_OTG,且状态(getState())为VolumeInfo.State.MOUNTED
  • 获取访问路径:从已挂载的VolumeInfo对象中,通过getPath()方法可以获取到该存储卷的根目录File对象。这是后续所有文件操作的起点。

注意:从获取的File路径开始,应用通常拥有对该卷的读写权限,无需像访问公共媒体目录那样申请额外的用户动态权限(如ohos.permission.READ_MEDIAohos.permission.WRITE_MEDIA)。但连接和访问外部设备本身可能涉及ohos.permission.USB_EXTENSIONohos.permission.USB_ACCESSORY权限,需要在module.json5文件中声明。

2. 操作外置存储器中的文件

获取到根路径File rootDir = volumeInfo.getPath();后,即可使用标准的HarmonyOS文件API进行读写。

  • 文件读写:使用@ohos.file.fs API。
    • 构造目标文件路径let targetFile = rootDir + "/your_folder/your_file.dat";
    • 读写操作:使用fs.openSync(), fs.readSync(), fs.writeSync(), fs.copyFileSync(), fs.unlinkSync() 等方法对targetFile指向的文件进行操作。这与操作应用沙箱内文件的方法一致。

3. 操作外置存储器中的SQLite数据库文件

操作外置SQLite数据库的核心是,在初始化数据库连接时,将数据库路径指向外置存储设备上的.db文件。

  • 数据库路径let dbPath = rootDir + "/your_folder/your_database.db";
  • 建立连接:使用@ohos.data.relationalStore RDB接口。
    import relationalStore from '@ohos.data.relationalStore';
    let config = {
        name: dbPath, // 关键:指定完整的外部文件路径
        securityLevel: relationalStore.SecurityLevel.S1
    };
    relationalStore.getRdbStore(context, config, (err, store) => {
        if (err) {
            console.error(`Failed to get RdbStore. Code:${err.code}, message:${err.message}`);
            return;
        }
        console.info('Succeeded in getting RdbStore.');
        // 此后即可使用store进行增删改查
    });
    
  • 重要考虑
    • 性能:OTG设备的I/O速度可能低于手机内置存储,对于频繁的数据库操作需做好性能评估和优化。
    • 数据安全与完整性:外置设备可能被意外拔出。在代码中必须监听存储卷的卸载事件,并在事件发生时立即关闭数据库连接和文件操作,避免数据损坏。建议实现事务机制,并在可能的情况下增加数据校验或恢复逻辑。
    • 兼容性:确保外置存储设备文件系统格式(如FAT32, exFAT, NTFS)被HarmonyOS良好支持。某些格式(如NTFS)可能只有只读支持。

总结流程

  1. 声明必要权限(USB相关)。
  2. 监听存储卷变化,检测OTG设备的插入和移除。
  3. 设备插入后,从StorageManager获取对应VolumeInfo及挂载路径。
  4. 基于获取的根路径,拼接出目标文件或数据库的绝对路径。
  5. 使用标准fs API或RDB API,对该路径进行文件或数据库操作。
  6. 务必监听设备移除事件,并在事件回调中安全地关闭所有正在进行的I/O操作。

通过以上步骤,您的应用即可在HarmonyOS Next上实现将OTG外置存储作为扩展数据存储和操作空间的需求。

回到顶部