繁体   English   中英

使用 Flutter SQFlite 访问 SQLite 时没有此类表错误

[英]No such table error when accessing SQLite with Flutter SQFlite

我正在使用 SQLite 创建我的第一个 Flutter 项目。 这是一个购物清单应用程序。 这是进行数据库调用的实用程序 class:

import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';

class DbHelper {
  final int version = 1;
  Database db;

  Future testDb() async {
    db = await openDb();
    await db.execute('INSERT or IGNORE INTO lists VALUES (0, "Fruit", 2)');
    await db.execute(
        'INSERT or IGNORE INTO items VALUES (0, 0, "Apples", "2 Kg", "Better if they are green")');
    List lists = await db.rawQuery('select * from lists');
    List items = await db.rawQuery('select * from items');
    print(lists[0].toString());
    print(items[0].toString());
  }

  Future<Database> openDb() async {
    if (db == null) {
      db = await openDatabase(join(await getDatabasesPath(), 'shopping.db'),
          onCreate: (database, version) {
            database.execute(
                'CREATE TABLE lists(id INTEGER PRIMARY KEY, name TEXT, priority INTEGER)');
            database.execute(
                'CREATE TABLE items(id INTEGER PRIMARY KEY, idList INTEGER, name TEXT, quantity TEXT, note TEXT, ' +
                    'FOREIGN KEY(idList) REFERENCES lists(id))');
          }, version: version);
    }
    return db;
  }
}

这是我的主要 Flutter 小部件:

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    DbHelper dbHelper = DbHelper();
    dbHelper.testDb();

    return MaterialApp(
      title: appTitle,
      theme: ThemeData(
        primarySwatch: Colors.indigo
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text(appTitle),
          centerTitle: false,
        ),
      )
    );
  }
}

一旦我运行该应用程序,我就会收到以下消息:

[VERBOSE-2:ui_dart_state.cc(186)] Unhandled Exception: DatabaseException(Error Domain=FMDatabase Code=1 "no such table: items" UserInfo={NSLocalizedDescription=no such table: items}) sql 'INSERT or IGNORE INTO items VALUES (0, 0, "Apples", "2 Kg", "Better if they are green")' args []}
#0      wrapDatabaseException (package:sqflite/src/exception_impl.dart:11:7)
<asynchronous suspension>

我不明白是什么导致了这个错误的发生。 很明显,我创建了一个名为items的表,所以我无法弄清楚为什么no such table

我正在使用以下版本的 sqflite。 我也尝试过升级它们,但错误仍然存在

  sqflite: ^1.2.0
  path: ^1.6.4

我之前读过很多类似的 StackOverflow 问题,但到目前为止还没有找到答案。

来自https://pub.dev/packages/sqflite的文档

Database database = await openDatabase(path, version: 1,
    onCreate: (Database db, int version) async {
  // When creating the db, create the table
  await db.execute(
      'CREATE TABLE Test (id INTEGER PRIMARY KEY, name TEXT, value INTEGER, num REAL)');
});

db.execute 是异步的,因此您需要等待它,并且 onCreate 也应该定义为可等待的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM