Flutter/Dart/sqflite:如何传递动态数据库名给类以获取连接
Flutter 动态命名数据库连接实现方案
核心改造思路
原来的单例类仅支持固定名称的数据库连接,要实现动态命名,需调整以下几点:
- 用Map缓存不同名称的数据库实例,避免重复创建连接
- 将无参的
databasegetter替换为带参数的异步方法 - 初始化方法接收数据库名称参数,生成对应路径
改造后的完整代码
import 'package:path/path.dart'; import 'package:sqflite/sqflite.dart'; import 'dart:io' as io; import 'package:path_provider/path_provider.dart'; class DatabaseHelper { // 单例构造 DatabaseHelper._privateConstructor(); static final DatabaseHelper instance = DatabaseHelper._privateConstructor(); static const _databaseVersion = 1; // 用Map存储不同名称的数据库实例 static final Map<String, Database> _databases = {}; // 带参数的数据库获取方法 Future<Database> getDatabase(String dbName) async { // 缓存存在则直接返回 if (_databases.containsKey(dbName)) { return _databases[dbName]!; } // 不存在则初始化并缓存 final db = await _initDatabase(dbName); _databases[dbName] = db; return db; } _onOpen(Database db) async { // 自定义打开逻辑 } // 接收数据库名称参数初始化 Future<Database> _initDatabase(String dbName) async { io.Directory documentDirectory = await getApplicationDocumentsDirectory(); String path = join(documentDirectory.path, dbName); return await openDatabase( path, version: _databaseVersion, onOpen: _onOpen, // 如果需要初始化表结构,添加onCreate回调 // onCreate: (db, version) async { // await db.execute('CREATE TABLE myTable (id INTEGER PRIMARY KEY)'); // }, ); } // 可选:添加关闭指定数据库的方法 Future<void> closeDatabase(String dbName) async { if (_databases.containsKey(dbName)) { await _databases[dbName]!.close(); _databases.remove(dbName); } } }
调用示例
Future<void> createNewApplication() async { // 传入动态数据库名称获取连接 Database db = await DatabaseHelper.instance.getDatabase("database1234"); // 执行查询(注意添加await) final data = await db.rawQuery("SELECT * from myTable"); }
注意事项
- 同一个数据库名称多次调用
getDatabase会返回缓存的实例,避免重复打开连接 - 如果需要为新数据库创建表结构,在
openDatabase中添加onCreate回调即可 - 若需关闭某个数据库,调用
closeDatabase方法可以移除缓存并关闭连接
内容的提问来源于stack exchange,提问作者Lucas Taulealea
相关产品推荐
相关产品推荐

