sqlite 如何在sqflite中创建一个数据库中的多个表?

ltskdhd1  于 2022-12-04  发布在  SQLite
关注(0)|答案(7)|浏览(423)

我正在构建一个使用SQLite数据库的flutter应用程序。我已经使用这段代码创建了第一个表:

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

表被创建,我可以访问它没有问题。
不幸的是,我不能包含一个以上的表,我刚刚创建。我试图添加另一个SQL CREATE TABLE子句在同一个方法,并重复方法db.execute与不同的SQL子句只是在下一行。
我正在模仿本教程中的代码:https://www.youtube.com/watch?v=xke5_yGL0uk
如何在同一个数据库中添加另一个表?

lzfw57am

lzfw57am1#

例如,您可以只合并多个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
       )''');
px9o7tmv

px9o7tmv2#

是,你可以的

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
}
cu6pst1q

cu6pst1q3#

可以使用包含DB脚本的.sql文件。
首先,将脚本文件添加到资源。
然后,导入以下包:

import 'package:path/path.dart';

import 'package:sqflite/sqflite.dart';

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

最后,使用以下代码

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,
       );
}
mrphzbgm

mrphzbgm4#

更改DB文件的名称。这将“重置”您的DB,并且创建将生效。
例如:

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

flmtquvp5#

openDatabase(path, onCreate, version)中,使用另一个可选参数"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()方法中增加数据库版本,以便调用升级,否则不会调用。

tvz2xvvm

tvz2xvvm6#

如果不查看您的openDatabase调用以及该数据库以前是否存在,很难说。我的猜测之一是您仍在使用相同的数据库版本。一旦调用了onCreate,就不会再调用它。您应该尝试提升数据库版本,并在onUpgrade上添加新表

uurity8g

uurity8g7#

可以使用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)');
  }

相关问题