Как создать несколько таблиц в базе данных Sqlite в разное время в Flutter - PullRequest
1 голос
/ 15 октября 2019

Итак, изначально я создал таблицу с именем «TABLE» в базе данных. Я хотел добавить еще одну таблицу. Поэтому я добавил еще один запрос для создания таблицы. Однако я получаю сообщение об ошибке «TABLE1 не существует» при запуске приложения.

Я чувствую, что в моем коде есть изъян. Я думаю, что метод _onCreate () будет вызываться только при первом запуске приложения. Поэтому любой код, который я добавлю к методу _onCreate (), впоследствии не будет выполняться. Любая помощь будет оценена.

     class DBHelper {
       static Database _db;
       static const String DB_NAME = 'employeeDB';

       static const String ID = 'id';
       static const String NAME = 'name';
       static const String TABLE = 'Employee';

       static const String ID1 = 'id1';
      static const String NAME1 = 'name1';
     static const String TABLE1 = 'Employee1';


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

 initDb() async {
 io.Directory documentsDirectory = await getApplicationDocumentsDirectory();
String path = join(documentsDirectory.path, DB_NAME);
var db = await openDatabase(path, version: 1, onCreate: _onCreate);
return db;
  }

 _onCreate(Database db, int version) async {
 await db.execute("CREATE TABLE $TABLE ($ID INTEGER PRIMARY KEY,$NAME TEXT)");
await db.execute("CREATE TABLE $TABLE1 ($ID1 INTEGER PRIMARY KEY,$NAME1 TEXT)");

  }

   Future<Employee> save(Employee employee) async {
var dbClient = await db;
employee.id = await dbClient.insert(TABLE, employee.toMap());
return employee;

  }

  Future<Employee1> saveEmp1(Employee1 employee) async {
var dbClient = await db;
employee.id = await dbClient.insert(TABLE1, employee.toMap());
return employee;

  }


   Future<List<Employee>> getEmployees() async {
var dbClient = await db;
List<Map> maps = await dbClient.query(TABLE, columns: [ID, NAME]);


List<Employee> employees = [];
if (maps.length > 0) {
  for (int i = 0; i < maps.length; i++) {
    employees.add(Employee.fromMap(maps[i]));

  }
  }


return employees;
}


Future<List<Employee1>> getEmployees1() async {
var dbClient = await db;
List<Map> maps = await dbClient.query(TABLE1, columns: [ID1, 
 NAME1]);


List<Employee1> employees = [];
if (maps.length > 0) {
  for (int i = 0; i < maps.length; i++) {
    employees.add(Employee.fromMap(maps[i]));

  }
}
return employees;
   }

  }

Ответы [ 2 ]

1 голос
/ 15 октября 2019

При первом запуске этого приложения и initDb () в эмуляторе был создан файл db employeeDB.
и он не будет создан снова

Для выполнения только тестового приложения вы можете изменить

String DB_NAME = 'employeeDB'

на другое имя

String DB_NAME = 'employeeDB1'

иливы можете сначала удалить это приложение из эмулятора, а затем снова запустить его.

фрагмент исходного кода https://github.com/tekartik/sqflite/blob/master/sqflite/lib/sqlite_api.dart

/// Called when the database is created.
  OnDatabaseCreateFn onCreate;

Для переноса схемы вы можете использовать OnUpgrade, подробные ссылки https://efthymis.com/migrating-a-mobile-database-in-flutter-sqlite/

фрагмент кода

await openDatabase(path,
  version: 1,
  onCreate: (Database db, int version) async {
    await db.execute(initialSchema));
  },
  onUpgrade: (Database db, int oldVersion, int newVersion) async {
    await db.execute(migrationScript));
  });
0 голосов
/ 15 октября 2019

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

Вы можете ознакомиться с подробными инструкциями / руководством по коду здесь .

...