使用 Flutter SQFlite 访问 SQLite 时没有这样的 table 错误
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
的table,所以我想不通为什么会有no such table
.
我正在使用以下版本的 sqflite。我也尝试过升级它们,但错误仍然存在
sqflite: ^1.2.0
path: ^1.6.4
我以前读过很多类似的 Whosebug 问题,但到目前为止一直找不到答案。
来自 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 也应该被定义为可等待的。
我正在使用 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
的table,所以我想不通为什么会有no such table
.
我正在使用以下版本的 sqflite。我也尝试过升级它们,但错误仍然存在
sqflite: ^1.2.0
path: ^1.6.4
我以前读过很多类似的 Whosebug 问题,但到目前为止一直找不到答案。
来自 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 也应该被定义为可等待的。