Flutter: ошибка DatabaseException при попытке выполнить операцию вставки - PullRequest
0 голосов
/ 31 марта 2020

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

Модель данных:

class User {
  int id;
  String token;

  User({
    this.id,
    this.token,
  });

  factory User.fromJson(Map<String, dynamic> data) => new User(
    id: data["id"],
    token: data["token"],
  );

  Map<String, dynamic> toJson() => {
    "id": id,
    "token": token,
  };
}

Файл базы данных:

class UserDb {
  UserDb._();
  static final UserDb db = UserDb._();

  Database _database;

  Future<Database> get database async {
    if (_database != null) {
      return _database;
    }

    _database = await initDB();
    return _database;
  }

  initDB() async {
    Directory documentsDirectory = await getApplicationDocumentsDirectory();
    String path = join(documentsDirectory.path, "TestDB.db");

    return await openDatabase(path, version: 1, onOpen: (db) {},
        onCreate: (Database db, int version) async {
      await db.execute("CREATE TABLE User (id INTEGER PRIMARY KEY, token TEXT)");
    });
  }

  newClient(User user) async {
    final db = await database;
    var table = await db.rawQuery("SELECT MAX(id)+1 as id FROM User");
    int id = table.first["id"];

    var raw = await db.rawInsert(
        "INSERT INTO User (id, token)"
        " VALUES (?,?)",
        [id, user.token]);
    return raw;
  }
}

Ошибка:

[ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: DatabaseException(table User has no column named token (code 1): , while compiling: INSERT INTO User (id, token) VALUES (?,?)) sql 'INSERT INTO User (id, token) VALUES (?,?)' args [50000001, 5e7aa383bdd9693090ce2116]}

1 Ответ

0 голосов
/ 31 марта 2020

initDB() будет вызываться только один раз при первом запуске этого приложения
После этого все изменения в initDB() больше не будут выполняться
Самый простой обходной путь - переименовать TestDB.db в другое имя, например TestDB1.db

Чтобы использовать приложение удаления и избежать Android автоматического резервного копирования, вы можете сослаться на Файл базы данных SQLite остается после удаления приложения

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