openOnDowngradeDelete method

Future<Database> openOnDowngradeDelete(
  1. String name, {
  2. int? version,
  3. OnUpgradeNeededFunction? onUpgradeNeeded,
  4. OnBlockedFunction? onBlocked,
})

Open a database and delete in case of downgrade.

Implementation

Future<Database> openOnDowngradeDelete(
  String name, {
  int? version,
  OnUpgradeNeededFunction? onUpgradeNeeded,
  OnBlockedFunction? onBlocked,
}) async {
  Future<Database> doOpen() {
    return open(
      name,
      version: version,
      onUpgradeNeeded: onUpgradeNeeded,
      onBlocked: onBlocked,
    );
  }

  if (version == null) {
    return doOpen();
  }
  try {
    return await doOpen();
  } catch (e) {
    // ignore: avoid_print
    print('openOnDowngradeDelete: error ${e.runtimeType} $e');

    /// There is no good way to detect a downgrade, try to open without version to check the version
    var db = await open(name);
    var isDowngrade = version < db.version;
    db.close();

    if (isDowngrade) {
      await deleteDatabase(name);
    } else {
      rethrow;
    }
    return await doOpen();
  }
}