在flutter中使用sqlflite删除数据库似乎不起作用

A. *_*nch 5 sqlite dart flutter

对于我的应用程序,我正在一个预先填充的数据库中加载一些启动器/默认数据,供用户遵循本教程:https : //github.com/tekartik/sqflite/blob/master/doc/opening_asset_db.md 在调试时我我将要添加/删除一堆测试数据,并且不想每次重新加载应用程序时都必须手动重置内容,因此我每次都从数据库加载一个新副本。

然而,出于某种原因,它没有从资产加载新副本,而是仍然打开现有的修改过的数据库。我检查了资产文件,它没有被修改,也没有达到在不删除以前版本的情况下打开机器上现有数据库的块。

我也没有在控制台中收到任何错误。

下面是初始化数据库的代码:

static Database _db;

  Future<Database> get db async {
    if(_db != null)
      return _db;
    _db = await initDb();
    return _db;
  }

  bool get isInDebugMode {
    bool inDebugMode = false;
    assert(inDebugMode = true);
    return inDebugMode;
  }

  //load database from existing db or copy pre-loaded db from assets
  initDb() async {
    //if in debug mode always load from asset file
    //done to reload from asset when default values added to database asset
    //and get rid of testing data
    //since it would be annoying to have to delete the file on the emulator every time

    debugPrint("initializing the db connection");
    var databasesPath = await getDatabasesPath();
    var path = join(databasesPath, "myDatabase.db");

    if(isInDebugMode){
      // delete existing if any
      await deleteDatabase(path);

      // Copy from asset
      ByteData data = await rootBundle.load(join("assets", "assetDB.db"));
      List<int> bytes = data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
      await new File(path).writeAsBytes(bytes);

      // open the database
      var db = await openDatabase(path, readOnly: false);
      return db;

    } else {
      // try opening (will work if it exists)
      Database db;
      try {
        db = await openDatabase(path, readOnly: false);
      } catch (e) {
        print("Error $e");
      }

      if (db == null) {
        // Should happen only the first time you launch your application
        print("Creating new copy from asset");

        // Copy from asset
        ByteData data = await rootBundle.load(join("assets", "assetDB.db"));
        List<int> bytes =
        data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
        await new File(path).writeAsBytes(bytes);

        //debugPrint(bytes.length.toString());

        // open the database
        db = await openDatabase(path, readOnly: true);
      } else {
        print("Opening existing database");
      }

      return db;
    }

  }
Run Code Online (Sandbox Code Playgroud)

我应该提一下,当我加载这些更改和到达调试模式时从资产初始化新数据库的块时,我没有进行热重载。

谢谢你的帮助!

ale*_*xtk 5

除非您格外小心,否则 Hotreload 和插件并不总是能很好地配合使用。在您的情况下,您尝试删除可能仍处于打开状态的数据库。所以你应该在删除它之前尝试关闭它。一种解决方案是保存对数据库的全局引用并在调用 deleteDatabase 之前关闭它