'Flutter Error when creating SQL DB table by giving tableName parameter
I found a flutter sqfl example on the web and trying to modify it for my personal project.
I need more than one table in a database, so I want to be able to create different tables by giving tableName parameters at runtime.
When I tried to add tableName as a parameter in '_onCreate' method for table creation I got an error that warns me that "The argument type 'Future Function(Database, int, String)' can't be assigned to the parameter type 'FutureOr Function(Database, int)?'."
// this opens the database (and creates it if it doesn't exist)
  _initDatabase() async {
    String path = join(await getDatabasesPath(), _databaseName);
    return await openDatabase(path,
        version: _databaseVersion, onCreate: _onCreate);
  }
  // SQL code to create the database table
  Future _onCreate(Database db, int version, String tableName) async {
    await db.execute('''
          CREATE TABLE $tableName (
            $columnId INTEGER PRIMARY KEY AUTOINCREMENT,
            $columnName TEXT NOT NULL,
            $columnMiles INTEGER NOT NULL
          )
          ''');
  }
							
						Solution 1:[1]
     void _createDb(Database db, int newVersion) async {
 await db.execute('''
   create table $carTable (
    $columnCarId integer primary key autoincrement,
    $columnCarTitle text not null
   )''');
 await db.execute('''
   create table $userTable(
    $userId integer primary key autoincrement,
    $name text not null
   )''');
  }
For creating multiple tables at a time.
Solution 2:[2]
the function for onCreate can only take two parameters Function(Database, int)? so it does not allow passs one more parameter. So I decided to pass my variable in sql query string by the another function as this;
Future _onCreateTable(
            Database db,
            int version,
          ) async {
            await db.execute(sqlTableCreation('cars_table'));
          }
    
String sqlTableCreation(String tableName) {
        String result = "''' CREATE TABLE $tableName ($columnId INTEGER PRIMARY KEY AUTOINCREMENT,$columnName TEXT NOT NULL,$columnMiles INTEGER NOT NULL)'''";
        return result;
      }
    					Solution 3:[3]
You can create your queries separately and then execute all at a same time like the following
queryForFirstTable = 'CREATE TABLE TABLENAME(your properties here)';
queryForSecondTable= 'CREATE TABLE ANOTHERTABLENAME(your properties here)';
 await openDatabase(
        join(await getDatabasesPath(), dbName),
        version: 1, onCreate: (Database db, int version) async {
      await db.execute(queryForFirstTable);
      await db.execute(queryForSecondTable);
    });
Hopefully by doing this you can easily create multiple tables.
Or if you want to create dynamic table at the runtime you can try this solution
public void createTable(String tableName) {
    final SQLiteDatabase db = getWritableDatabase();
    String CREATE_TABLE_NEW_USER = "CREATE TABLE " + tableName + " (" + COLUMN_ID + " INTEGER PRIMARY KEY,"+ COLUMN_NAME + " TEXT)";
    db.execSQL(CREATE_TABLE_NEW_USER);
    db.close();
}
    					Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source | 
|---|---|
| Solution 1 | Maqsood | 
| Solution 2 | D. GÜL | 
| Solution 3 | 
