如何在Flutter中不同时间在Sqlite数据库中创建多个table

How to create multiple table in Sqlite database at different times in Flutter

所以最初我在数据库中创建了一个名为 "TABLE" 的 table。我想再添加一个 table。所以我添加了另一个查询来创建 table。但是,当我 运行 应用程序时,出现 "TABLE1 does not exist" 错误。

我确实觉得我的代码有缺陷。我认为 _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;
   }

  }

第一次运行这个应用程序和模拟器中的 initDb(),employeeDB 已经创建了 db 文件。
并且不会再次创建

仅测试应用执行, 你可以改变

String DB_NAME = 'employeeDB'

换个名字

String DB_NAME = 'employeeDB1'

或者您可以先从 Emulator 卸载此应用,然后 运行 再次卸载它。

https://github.com/tekartik/sqflite/blob/master/sqflite/lib/sqlite_api.dart

的源代码片段
/// Called when the database is created.
  OnDatabaseCreateFn onCreate;

schema迁移,可以使用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));
  });

您必须使用 onUpgrade 处理程序针对现有数据库创建迁移并 运行 它们。基本上你需要检查现有的数据库版本,如果版本小于迁移数,则升级。

您可以查看详细steps/code教程here

我需要创建的不仅仅是多个表;但多个数据库。从那以后,我开发了一个飞镖包; sqlite_at_runtime 延伸至在 运行 时间创建所有这些实体。

下面是创建三个具有相似属性的表的示例代码。

await Sqlartime.tableCreate(['sample1','sample2','sample3'],['name TEXT','age INTEGER','temp REAL']);