如何在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']);
所以最初我在数据库中创建了一个名为 "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']);