Flutter如何导出或拷贝sqlite数据库并修改数据库存储路径?
Flutter SQLite 数据库自定义存储路径及导出方案
前置权限配置
操作失败的绝大多数原因是缺少必要的存储权限,先确认两端配置完整:
- Android端:在
android/app/src/main/AndroidManifest.xml中添加权限声明,不同系统版本对应权限不同:
仅静态声明无效,需要配合<!-- Android 12及以下版本权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- Android 13及以上版本权限 --> <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />permission_handler之类的工具包做运行时权限申请,用户同意后才能操作公共存储路径。 - iOS端:如果需要让用户在系统文件App中看到数据库文件,在
ios/Runner/Info.plist中添加配置:<key>UIFileSharingEnabled</key> <true/> <key>LSSupportsOpeningDocumentsInPlace</key> <true/>
自定义数据库存储路径实现
原来的getDatabasesPath()返回的是应用私有沙盒路径,默认其他应用/用户无法直接访问,修改存储路径的完整代码如下:
- 导入依赖包
import 'dart:io'; import 'package:path/path.dart'; import 'package:path_provider/path_provider.dart'; import 'package:sqflite/sqflite.dart';
- 定义自定义路径获取方法
Future<String> getCustomDbPath() async { // 示例1:存储到应用私有文档目录,仅本应用可访问,卸载应用会同步删除 // Directory appDocDir = await getApplicationDocumentsDirectory(); // 示例2:存储到Android外部存储公共目录,用户可直接访问,卸载应用不会删除 Directory? publicDir = await getExternalStorageDirectory(); // 示例3:直接存储到公共下载文件夹 // Directory? downloadDir = await getExternalStoragePublicDirectory(ExternalStorageDirectory.downloads); String dbPath = join(publicDir!.path, "pilots.db"); return dbPath; }
- 替换原数据库初始化逻辑
String targetDbPath = await getCustomDbPath(); // 路径不存在时先创建父目录,避免打开报错 Directory parentDir = Directory(dirname(targetDbPath)); if (!await parentDir.exists()) { await parentDir.create(recursive: true); } mydatabase = await openDatabase(targetDbPath);
现有数据库迁移/导出方法
如果原有数据库已经存在于默认沙盒路径,需要导出到其他位置可以直接做文件复制:
Future<void> exportExistingDb() async { // 1. 读取原有数据库文件 String oldPath = join(await getDatabasesPath(), "pilots.db"); File oldDbFile = File(oldPath); if (!await oldDbFile.exists()) return; // 2. 定义导出目标路径,这里示例为公共下载目录 Directory? downloadDir = await getExternalStoragePublicDirectory(ExternalStorageDirectory.downloads); String exportPath = join(downloadDir!.path, "pilots_backup.db"); // 3. 执行复制操作 await oldDbFile.copy(exportPath); }
内容的提问来源于stack exchange,提问作者kamil kowalski
相关产品推荐
相关产品推荐

