Как создать несколько таблиц в базе данных в sqflite?

Я строю и приложение с флаттером, который использует базу данных SQLite. Я создал первую таблицу, используя этот кусок кода:

 void _createDb(Database db, int newVersion) async {
    await db.execute('''CREATE TABLE cards (id_card INTEGER PRIMARY KEY, 
         color TEXT, type TEXT, rarity TEXT, name TEXT UNIQUE, goldCost INTEGER,
         manaCost INTEGER, armor INTEGER, attack INTEGER, health INTEGER, description TEXT)''');
}

Таблица создается, и я могу получить к ней доступ без проблем.

К сожалению, я не могу включить более 1 таблицы, которую я только что создал. Я попытался добавить еще одно предложение SQL CREATE TABLE в тот же метод и повторил метод db.execute с другим предложением SQL только в следующей строке.

Я имитирую код из этого урока: https://www.youtube.com/watch?v=xke5_yGL0uk

Как добавить еще одну таблицу в той же базе данных?

7 ответов

Вы можете просто объединить несколько вызовов db.execute для примера

await db.execute('''
      create table $reminderTable (
        $columnReminderId integer primary key autoincrement,
        $columnReminderCarId integer not null,
        $columnReminderName text not null,
        $columnReminderNotifyMileage integer not null,
        $columnReminderEndMileage integer not null
       )''');
await db.execute('''
       create table $carTable (
        $columnCarId integer primary key autoincrement,
        $columnCarTitle text not null
       )''');

Да, ты можешь сделать это

 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
   )''');
  }

но чтобы ускорить процесс, предположим, что у нас есть 10 таблиц, вы можете использовать пакет таким образом

void _createDb(Database db, int newVersion) async {
Batch batch = db.batch();
batch.execute("Your query-> Create table if not exists");
batch.execute("Your query->Create table if not exists");
List<dynamic> res = await batch.commit();
//Insert your controls
}

You can use a.sql file that contains your DB script.

First,add the script file to assets.

Then, import the following packages:

import 'package:path/path.dart';

import 'package:sqflite/sqflite.dart';

import 'package:flutter/services.dart' show rootBundle;

finally, use the following code

void _createDb() async 
{
      final database = openDatabase( join( await getDatabasesPath(), 'mydb.db'),
      onCreate: (db, version) async  
      {
          // call database script that is saved in a file in assets
          String script =  await rootBundle.loadString("assets\\db\\script.sql");
          List<String> scripts = script.split(";");
          scripts.forEach((v) 
          {
              if(v.isNotEmpty ) 
              {
                   print(v.trim());
                   db.execute(v.trim());
              }
          });
       },
       version: 1,
       );
}

Измените название DBфайл. Это "сбросит" вашу БД, и создание будет работать.

например:

final dabasesPath = await getDatabasesPath(); 
final path = join(dabasesPath, "newName2.db");

В openDatabase(путь, onCreate, версия) используйте еще один необязательный параметр "onUpgrade" и определите сценарии удаления и повторного создания таблиц. а также обновить (увеличить) версию параметра на единицу.

----- Фрагмент кода ------

openDatabase(path, onCreate:_createDb, onUpgrade: onUpgrade,version:_DB_VERSION);
...
...

    _onUpgrade( Database db, int oldVersion, int newVersion ) async {

    Batch batch = db.batch();

    // drop first

    batch.execute("DROP TABLE IF EXISTS $_TABLE_3 ;");

    batch.execute("DROP TABLE IF EXISTS $_TABLE_2 ;");
    batch.execute("DROP TABLE IF EXISTS $_TABLE_1 ;");
    // then create again
    batch.execute("CREATE TABLE $TABLE_1 ...... ");
    batch.execute("CREATE TABLE $TABLE_2 ...... ");
    batch.execute("CREATE TABLE $TABLE_3 ...... ");
    List<dynamic> result = await batch.commit();

}

Примечание. Каждый раз, когда вы будете создавать или изменять структуру какой-либо таблицы (таблиц), вам придется увеличивать версию базы данных в методе openDatabase(). так что обновление будет вызываться, иначе оно не будет вызываться.

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

вы можете использовать db.execute для создания нескольких таблиц в одной базе данных.

      Future _createDB(Database db, int version) async {
    await db.execute('CREATE TABLE users(userId INTEGER PRIMARY KEY, userName TEXT NOT NULL)');
    await db.execute('CREATE TABLE tasks(taskId INTEGER PRIMARY KEY, userId INTEGER, task TEXT NOT NULL, status BOOL NOT NULL)');
  }
Другие вопросы по тегам