You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()返回的是应用私有沙盒路径,默认其他应用/用户无法直接访问,修改存储路径的完整代码如下:

  1. 导入依赖包
import 'dart:io';
import 'package:path/path.dart';
import 'package:path_provider/path_provider.dart';
import 'package:sqflite/sqflite.dart';
  1. 定义自定义路径获取方法
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;
}
  1. 替换原数据库初始化逻辑
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 17:39:04