sqflite сломался на Android после добавления новой таблицы Flutter - PullRequest
0 голосов
/ 22 апреля 2020

Я только что добавил новую таблицу «Переводы» в базу данных init и написал все грубые методы. Команды db.query и db.insert работают просто отлично, но, как и внутри updateVersion(), либо db.delete, либо db.update выдают ошибку отсутствующего плагина: ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: MissingPluginException(No implementation found for method update on channel com.tekartik.sqflite).

Через некоторое время я понял, что также две старые таблицы теперь выдают ту же ошибку при удалении и обновлении команды. Похоже, что добавление новой таблицы сломало все это. Я попытался очистить флаттер, но ничего не изменилось, поэтому я удалил и переустановил приложение, но все равно получаю те же ошибки. Затем я закомментировал новую таблицу и переустановил приложение, но все еще получаю ошибки .. Я также попытался сделать недействительным кеш, перезапустить, но все тот же .. На тесте iPhone он не выдает никакой ошибки ..

В iOS CoreData своего рода ведет себя так же, когда вы что-то меняете ... но при установке приложения fre sh все сбрасывается ... здесь кажется, что БД все еще записывается на диск .. Как мне убедиться, что я стер это ? Я пытался await deleteDatabase(path);.

Есть идеи, что происходит? Как всегда, большое спасибо за ваше время и помощь. Это дБ:


class DBProvider {
  //1.Create a private constructor that can be used only inside the class :
  DBProvider._();
  static final DBProvider db = DBProvider._();

  //2.Setup the database
  //Next we will create the database object and provide it with a getter
  //where we will instantiate the database if it’s not (lazy initialization).

  static Database _database;

  Future<Database> get database async {
    if (_database != null) return _database;
//    await Sqflite.devSetDebugModeOn(true);
    // if _database is null we instantiate it
    _database = await initDB();
    return _database;
  }
  // If there is no object assigned to the database,
  // we use the initDB function to create the database.
  // In this function, we will get the path for storing the database
  // and create the desired tables:

  initDB() async {
    Directory documentsDirectory = await getApplicationDocumentsDirectory();
    String path = join(documentsDirectory.path, "Fixit.db");
    //TODO: tried deleting
//    await deleteDatabase(path); // still errors
    return await openDatabase(path, version: 1, onOpen: (db) {},
        onCreate: (Database db, int version) async {
      await db.execute("CREATE TABLE Route("
          "routeId TEXT,"
          "routeName TEXT,"
          "routeDistance TEXT,"
          "routeDuration TEXT,"
          "coordinates TEXT"
          ")");
      await db.execute("CREATE TABLE Alarm("
          "alarmId TEXT,"
          "alarmName TEXT,"
          "enabled BOOL,"
          "repeatWeekdays TEXT,"
          "time TEXT,"
          "sound TEXT,"
          "routeName TEXT"
          ")");
//      await db.execute("CREATE TABLE Translations("
//          "version TEXT"
//          ")");
    });
  }

}

и методы CRUD:

class DefaultsDbRepository {
  var database = DBProvider.db.database;

  Future<int> checkVersion() async {
    final db = await database;
    try {
      var res = await db.query('Translations');
      assert(res != null);
      int version = res != null ? int.parse(res.first['version']) : 0;

      print('checkVersion() db version is: $version');
      return version;
    } catch (err) {
      print(err);
    }
  }

  saveVersion({int version}) async {
    print('saveVersion() version to save is : $version');

    assert(version != null);
    final db = await database;
    try {
      Map<String, dynamic> map = {'version': version};
      db.insert("Translations", map);
    } catch (e) {
      print(e);
    }
  }

  updateVersion({int newVersion, int oldVersion}) async {
    print('updateVersion() version to save is : $newVersion');
    assert(newVersion != null);

    final db = await database;
    db.delete("Translations");
    try {
//      Map<String, dynamic> map = {'version': newVersion};
//
//      db.insert("Translations", map);
//      db.update("Translations", map); // [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: MissingPluginException(No implementation found for method update on channel com.tekartik.sqflite)
//      db.update("Translations", map,
//          where: "version = ?", whereArgs: [oldVersion]);
    } catch (e) {
      print(e);
    }
  }
}

1 Ответ

0 голосов
/ 22 апреля 2020

Наконец-то снова заработал. После нескольких, удаления, очистки и повторной установки я увидел проблему. Я использовал ' вместо " в моих методах БД.

Поэтому я изменил 'с:

saveVersion({int version}) async {
    print('saveVersion() version to save is : $version');

    assert(version != null);
    final db = await database;
    try {
      Map<String, dynamic> map = {'version': version};
      db.insert("Translations", map);
    } catch (e) {
      print(e);
    }
  }

на:

saveVersion({int version}) async {
    print('saveVersion() version to save is : $version');

    assert(version != null);
    final db = await database;
    try {
      Map<String, dynamic> map = {"version": version};
      db.insert("Translations", map);
    } catch (e) {
      print(e);
    }
  }

и все команды работают как положено. Надеюсь, что это поможет другим. Приветствия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...