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

Flutter/Dart/sqflite:如何传递动态数据库名给类以获取连接

Flutter 动态命名数据库连接实现方案

核心改造思路

原来的单例类仅支持固定名称的数据库连接,要实现动态命名,需调整以下几点:

  • 用Map缓存不同名称的数据库实例,避免重复创建连接
  • 将无参的database getter替换为带参数的异步方法
  • 初始化方法接收数据库名称参数,生成对应路径

改造后的完整代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 12:13:53