如何在Flutter中打开已创建的SQLite数据库?解决权限报错
解决Flutter安卓端无法读取外部存储SQLite数据库的问题
1. 申请存储访问权限
安卓系统限制应用直接访问外部存储文件,必须先获取对应权限:
- 在
pubspec.yaml中添加权限依赖:
dependencies: permission_handler: ^10.2.0
- 修改数据库初始化逻辑,确保打开数据库前已拿到权限:
import 'package:permission_handler/permission_handler.dart'; Future<Database> _initDatabase() async { // 请求存储权限 var permissionStatus = await Permission.storage.request(); if (!permissionStatus.isGranted) { throw Exception("存储权限未授予,无法访问数据库文件"); } print('1'); Database database = await openDatabase( '/storage/emulated/0/Etudes/PFE/Implementation/database/example.db', version: 1, ); print('2'); return database; }
注意:安卓13及以上需使用细分权限(如Permission.photos),若数据库不属于媒体文件,可使用Permission.manageExternalStorage(该权限需谷歌应用商店特殊审核,谨慎使用)。
2. 避免硬编码存储路径
硬编码路径在不同设备上可能失效,用path_provider包获取标准外部存储路径:
- 添加依赖:
dependencies: path_provider: ^2.0.15
- 动态拼接数据库路径:
import 'package:path_provider/path_provider.dart'; import 'dart:io'; Future<Database> _initDatabase() async { var permissionStatus = await Permission.storage.request(); if (!permissionStatus.isGranted) { throw Exception("存储权限未授予"); } // 获取应用外部存储根目录 Directory? externalStorageDir = await getExternalStorageDirectory(); String dbPath = '${externalStorageDir!.path}/Etudes/PFE/Implementation/database/example.db'; print('1'); Database database = await openDatabase( dbPath, version: 1, ); print('2'); return database; }
3. 调整数据库文件权限
Python脚本创建的文件可能仅对创建者开放读取权限,需修改文件权限:
- 手动操作:在手机文件管理器中找到目标数据库,将权限设置为「允许所有应用读取」
- 命令行操作(需连接电脑):
adb shell chmod 644 /storage/emulated/0/Etudes/PFE/Implementation/database/example.db
4. 适配安卓10+分区存储规则
安卓10(API 29)及以上启用分区存储,应用默认无法直接访问外部存储的自定义目录,可选两种方案:
- 将数据库文件移动到
getExternalStorageDirectory()返回的应用专属外部存储目录下 - 在
AndroidManifest.xml中添加兼容配置(仅安卓10生效):
<application ... android:requestLegacyExternalStorage="true"> </application>
内容的提问来源于stack exchange,提问作者Mikelenjilo
相关产品推荐
相关产品推荐

