Flutter Sqflite - Удаляет базу данных при выходе пользователя из системы

Я использую базу данных Sqflite для своего приложения для хранения пользовательских данных. Проблема в том, что когда пользователь выходит из системы, я хочу удалить базу данных, чтобы избежать конфликта, если пользователь входит в систему с другой учетной записью, например. Я не хочу отображать данные предыдущих пользователей при новом входе, верно?

Поэтому, когда я удаляю базу данных, кажется, что она работает нормально, но когда пользователь снова входит в систему, я получаю следующую ошибку:

[VERBOSE-2:ui_dart_state.cc(157)] Unhandled Exception: NoSuchMethodError: The method 'query' was called on null.

Получатель: ноль

Думаю, проблема в том, что _databaseVersion всегда 1, поэтому мне интересно, как я могу решить эту проблему?

КЛАСС

    class DatabaseHelper {
  static final _databaseName = "MyDatabase.db";
  static final _databaseVersion = 1;

  static final table = 'my_table';

  static final columnId = '_id';
  static final columnCity = 'city';
  static final columnAge = 'age';
  static final columnAds = 'ads';

  // make this a singleton class
  DatabaseHelper._privateConstructor();
  static final DatabaseHelper instance = DatabaseHelper._privateConstructor();

  // only have a single app-wide reference to the database
  static Database _database;
  Future<Database> get database async {
    if (_database != null) return _database;
    // lazily instantiate the db the first time it is accessed
    _database = await _initDatabase();
    return _database;
  }

  // this opens the database (and creates it if it doesn't exist)
  _initDatabase() async {
    print("init database");
    Directory documentsDirectory = await getApplicationDocumentsDirectory();
    String path = join(documentsDirectory.path, _databaseName);
    await openDatabase(path, version: _databaseVersion, onCreate: _onCreate);
  }

  // SQL code to create the database table
  Future _onCreate(Database db, int version) async {
    await db.execute('''
          CREATE TABLE $table (
            $columnId INTEGER PRIMARY KEY,
            $columnCity TEXT,
            $columnAge TEXT,
            $columnAds INT
          )
          ''');

    ///NOTE: columnAds 0 = true, 1 = false
  }

  // Helper methods

  // Inserts a row in the database where each key in the Map is a column name
  // and the value is the column value. The return value is the id of the
  // inserted row.
  Future<int> insert(Map<String, dynamic> row) async {
    Database db = await instance.database;
    return await db.insert(table, row);
  }

  // All of the rows are returned as a list of maps, where each map is
  // a key-value list of columns.
  Future<List<Map<String, dynamic>>> queryAllRows() async {
    Database db = await instance.database;
    return await db.query(table);
  }

  // All of the methods (insert, query, update, delete) can also be done using
  // raw SQL commands. This method uses a raw query to give the row count.
  Future<int> queryRowCount() async {
    Database db = await instance.database;
    return Sqflite.firstIntValue(
        await db.rawQuery('SELECT COUNT(*) FROM $table'));
  }

  // We are assuming here that the id column in the map is set. The other
  // column values will be used to update the row.
  Future<int> update(Map<String, dynamic> row) async {
    Database db = await instance.database;
    int id = row[columnId];
    return await db.update(table, row, where: '$columnId = ?', whereArgs: [id]);
  }

  // Deletes the row specified by the id. The number of affected rows is
  // returned. This should be 1 as long as the row exists.
  Future<int> delete(int id) async {
    Database db = await instance.database;
    return await db.delete(table, where: '$columnId = ?', whereArgs: [id]);
  }

  Future<bool> deleteDb() async {
    bool databaseDeleted = false;

    try {
      Directory documentsDirectory = await getApplicationDocumentsDirectory();
      String path = join(documentsDirectory.path, _databaseName);
      await deleteDatabase(path).whenComplete(() {
        databaseDeleted = true;
      }).catchError((onError) {
        databaseDeleted = false;
      });
    } on DatabaseException catch (error) {
      print(error);
    } catch (error) {
      print(error);
    }

    return databaseDeleted;
  }

  Future closeDb() async {
    var dbClient = await instance.database;
    dbClient.close();
  }

person Rusben Wladiskoz    schedule 31.12.2019    source источник


Ответы (2)


Ваш вспомогательный класс всегда использует _databaseVersion = 1.

Думаю, поэтому версия всегда 1.

person Celt K. B.    schedule 14.03.2020

Обычно вы не хотите удалять саму базу данных. Если это так, вам нужно снова создать базу данных при запуске приложения, иначе не будет запроса на запуск функций, связанных с базой данных, поэтому возникает ошибка. Я предлагаю удалить столбцы (таблицу) в базе данных.

// Delete LoginResponse records

Future<int> deleteLoginResponse(int id) async {
  final db = await dbProvider.database;
  var result = await db.delete(loginTABLE, where: 'id = ?', whereArgs: [id]);

  return result;
}
person Jiten Basnet    schedule 01.01.2020