Flutter桌面端Sqflite数据库位置查询及自定义路径设置问题
Flutter桌面端Sqflite数据库位置查询及自定义路径设置问题
嘿,我来帮你搞定Flutter桌面端用Sqflite自定义数据库路径的问题!
你当前的代码里,databaseFactory.getDatabasesPath()在桌面端会返回系统默认的数据库存储路径(比如Windows一般在AppData/Roaming下,Linux在~/.local/share里),这就是为什么你打印的路径不是项目文件夹。要把数据库放到项目目录里,咱们得调整路径的获取逻辑:
步骤1:确认依赖导入
确保你已经导入了dart:io和path包(你代码里已经用了path的p.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




