HarmonyOS鸿蒙Next中手机APP与外置OTG存储设备的通信,如何操作外置存储器中的sqlte数据库文件或进行文件的读写。
HarmonyOS鸿蒙Next中手机APP与外置OTG存储设备的通信,如何操作外置存储器中的sqlte数据库文件或进行文件的读写。 应用场景:我们的应用场景是手机内存不足的情况下,增加一个外置存储设备,里边存储模型文件、离线地图文件、结构化数据等, 业务操作时,直接操作外置储存设备中的文件,对其进行增删改查等操作。
手机APP与外置OTG存储设备的通信,如何操作外置存储器中的sqlte数据库文件或进行文件的读写?
在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通过StorageManager和VolumeInfo来管理系统存储卷。
- 动态发现设备:监听存储设备的挂载(
volumeMounted)和卸载(volumeUnmounted)事件。当用户插入OTG设备后,系统会发出相应事件。 - 获取VolumeInfo:通过
StorageManager的getVolumes()方法获取当前所有存储卷的列表。外置OTG设备通常是一个VolumeInfo,其类型(getType())为VolumeInfo.TYPE_PUBLIC或VolumeInfo.TYPE_OTG,且状态(getState())为VolumeInfo.State.MOUNTED。 - 获取访问路径:从已挂载的
VolumeInfo对象中,通过getPath()方法可以获取到该存储卷的根目录File对象。这是后续所有文件操作的起点。
注意:从获取的File路径开始,应用通常拥有对该卷的读写权限,无需像访问公共媒体目录那样申请额外的用户动态权限(如ohos.permission.READ_MEDIA或ohos.permission.WRITE_MEDIA)。但连接和访问外部设备本身可能涉及ohos.permission.USB_EXTENSION或ohos.permission.USB_ACCESSORY权限,需要在module.json5文件中声明。
2. 操作外置存储器中的文件
获取到根路径File rootDir = volumeInfo.getPath();后,即可使用标准的HarmonyOS文件API进行读写。
- 文件读写:使用
@ohos.file.fsAPI。- 构造目标文件路径:
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.relationalStoreRDB接口。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)可能只有只读支持。
总结流程
- 声明必要权限(USB相关)。
- 监听存储卷变化,检测OTG设备的插入和移除。
- 设备插入后,从
StorageManager获取对应VolumeInfo及挂载路径。 - 基于获取的根路径,拼接出目标文件或数据库的绝对路径。
- 使用标准fs API或RDB API,对该路径进行文件或数据库操作。
- 务必监听设备移除事件,并在事件回调中安全地关闭所有正在进行的I/O操作。
通过以上步骤,您的应用即可在HarmonyOS Next上实现将OTG外置存储作为扩展数据存储和操作空间的需求。

