【问题标题】:when is static Database? _db; not null?什么时候是静态数据库? _D b;不为空?
【发布时间】:2021-09-14 18:50:02
【问题描述】:

我第一次使用sqflite 创建数据库。我只是对创建 dbHelper 感到困惑。所有实现几乎都以相同的方式。令人困惑的问题是_db 在每次打开应用程序的开头它将始终为空,这意味着这总是会创建一个新表。 _db 什么时候不为空?

代码是:

class DatabaseHelper {
  DatabaseHelper._();
  static final DatabaseHelper _instance = DatabaseHelper._();
  factory DatabaseHelper() => _instance;
  static Database? _db;

  Future<Database?> createDB() async {
    if (_db != null) return _db;
    String path = await getDatabasesPath();
    _db = await openDatabase(
      join(path, "todo.db"),version: 1,
      onCreate: (Database database, int version)async {
        await database.execute('');
      },
    );
    return _db;
  }
}

【问题讨论】:

    标签: flutter sqflite


    【解决方案1】:

    TLDR; 只有在指定路径中找不到数据库文件时,才会调用 openDatabase 中传递给 onCreate 参数的回调。


    如果我的问题是正确的,您会担心多次创建相同的表,对吗? 除非用户清除应用数据,否则不会发生这种情况。来自docs

    如果在调用 openDatabase 之前数据库不存在,则调用 onCreate。您可以借此机会根据您的架构在数据库中创建所需的表

    我将尝试绘制出事件将发生的场景,希望这将为您清除一切:

    第一次运行应用时:

    1. 你发起通过工厂获取单例DatabaseHelper的实例
    2. 您调用createDB() 以获取 sqflite.Database 的实例
    3. _db 将为空,因此在调用 openDatabase 时会创建一个新的数据库实例并将其分配给 _db
    4. 由于getDatabasesPath()提供的路径中没有数据库文件,将调用onCreate并创建表
    5. 之后任何时候调用creatDB() 都不会触发相同的工作流,因为_db 不再为空(因为它是静态变量)

    第二次运行应用程序:

    1. 你发起通过工厂获取单例DatabaseHelper的实例

    2. 您调用createDB() 来获取 sqflite.Database 的实例

    3. _db 将为空,因此当openDatabase 被调用时,会创建一个新的数据库实例并将其分配给_db

    4. 并且由于getDatabasesPath() 提供的路径中存在数据库文件,因此onCreate()不会再次被调用

    5. 之后任何时候调用creatDB() 都不会触发相同的工作流,因为_db 不再为空(因为它是静态变量)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-03
      • 1970-01-01
      • 1970-01-01
      • 2019-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多