Как создать несколько таблиц в базе данных в 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)');
}