You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Flutter桌面端Sqflite数据库位置查询及自定义路径设置问题

Flutter桌面端Sqflite数据库位置查询及自定义路径设置问题

嘿,我来帮你搞定Flutter桌面端用Sqflite自定义数据库路径的问题!

你当前的代码里,databaseFactory.getDatabasesPath()在桌面端会返回系统默认的数据库存储路径(比如Windows一般在AppData/Roaming下,Linux在~/.local/share里),这就是为什么你打印的路径不是项目文件夹。要把数据库放到项目目录里,咱们得调整路径的获取逻辑:

步骤1:确认依赖导入

确保你已经导入了dart:iopath包(你代码里已经用了pathp.join,这部分应该没问题):

import 'dart:io';
import 'package:path/path.dart' as p;

步骤2:修改数据库路径逻辑

_initDatabase方法里的路径获取部分替换成下面的代码,直接指向你的项目文件夹:

Future<Database> _initDatabase() async {
  dev.log(" In DatabaseHelper:\n    _initDatabase(): open database.");
  if (Platform.isWindows || Platform.isLinux) {
    dev.log("     On desktop.");
    sqfliteFfiInit();
  }else{
    dev.log("     On mobile.");
  }
  databaseFactory = databaseFactoryFfi;

  // 关键修改:获取项目根目录路径(开发阶段有效)
  final projectDir = Directory.current.path;
  // 可选:创建专门存数据库的子文件夹,避免根目录杂乱
  final dbFolder = Directory(p.join(projectDir, 'database'));
  // 如果文件夹不存在,自动创建
  if (!await dbFolder.exists()) {
    await dbFolder.create(recursive: true);
  }
  // 拼接最终的数据库文件路径
  final path = p.join(dbFolder.path, SqlExp.fileName);

  print("Database path: ======> $path");

  return await databaseFactory.openDatabase(
    path,
    options: OpenDatabaseOptions(
      version: SqlExp.version,
      onCreate: _onCreate,
    ),
  );
}

逻辑说明

  • Directory.current在Flutter开发环境下,返回的就是你的项目根目录路径,这样数据库文件就会生成在项目里的database子文件夹(你也可以改成自己喜欢的文件夹名,甚至直接放根目录)。
  • 加入dbFolder.exists()create的判断,是为了确保存储文件夹存在,避免因路径不存在导致的初始化报错。

额外提醒

如果之后你要把桌面应用打包发布,Directory.current可能不再指向项目目录(打包后程序的工作目录会变化),这时候可以考虑让用户自定义存储路径,或者用path_provider获取系统的应用支持目录。但如果只是开发阶段想把数据库放在项目里,上面的代码完全够用。

运行修改后的代码,你就能看到打印的路径变成项目文件夹下的指定位置啦!

备注:内容来源于stack exchange,提问作者phesicolosophy

火山引擎 最新活动