如何在 sqflite 中创建多个表?

问题描述 投票:0回答:8

在我使用 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)''');
}

我无法创建多个表。我尝试以相同的方法添加另一个

CREATE TABLE
子句,并在下一行中使用不同的 SQL 子句重复
db.execute

如何在同一个数据库中添加另一个表?

flutter sqlite dart sqflite
8个回答
34
投票

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


27
投票

是的,你可以做到

 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
}

7
投票

您可以使用包含数据库脚本的 .sql 文件。

首先将脚本文件添加到assets中。

然后,导入以下包:

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

4
投票

openDatabase(path,  onCreate, version)
使用另一个可选参数
"onUpgrade"
并定义删除并再次创建表脚本。并且还将参数版本升级(增加)1。

-----代码片段------

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()
方法增加数据库版本。这样才会调用升级,否则不会调用。


4
投票

更改 .db 文件的名称。这将重置您的数据库,以便创建工作正常进行:

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

2
投票

如果没有看到您的

openDatabase
调用以及数据库之前是否存在,很难说。我的猜测之一是您仍在使用相同的数据库版本。一旦
onCreate
被调用,就不会再被调用。您应该尝试更改数据库版本并添加新表
onUpgrade


0
投票

根据我个人的经验,使用冗长的
await db.execute
可能会导致性能问题。

如果您有多个表,一种选择是在循环中使用

await db.execute
。 (性能问题)

但是,这种方法并不是最有效的方法。

更有效的方法是利用批处理方法。

我的一个项目有 23 个表,我们在循环中创建表(或者您可以按顺序编写它们,因为两种方法是等效的)。

我观察到显着的时间复杂度和一些数据库块。

因此,批量方法将是理想的解决方案。


0
投票

您可以使用

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)');
}
© www.soinside.com 2019 - 2024. All rights reserved.