Flutter SQLite 没有这样的列
Flutter SQLite no such column
我正在使用 Flutter SQFlite 插件开发一个使用 SQLite 数据库的 Flutter 应用程序。
问题是当我尝试插入一些测试数据时,应用程序在控制台中打印以下内容:
Unhandled Exception: DatabaseException(no such column: dummy_value (code 1): , while compiling: INSERT INTO DemoTable (name) VALUES(dummy_value)) sql 'INSERT INTO DemoTable (name) VALUES(dummy_value)' args []}
据我从日志中了解到,问题出在 'dummy_value' 列,但真正的问题在于,我的数据库有 'id' 和 'name' 列,而 'dummy_value' 是值,发送到列 'name'.
以下是我创建数据库的代码:
class DatabaseCreator {
static const table = 'DemoTable';
static const id = 'id';
static const name = 'name';
static Database db;
initDatabase() async {
Directory documentsDirectory = await
getApplicationDocumentsDirectory();
String path = join(documentsDirectory.path, 'Demo.db');
db = await openDatabase(path, version: 1, onCreate: _onCreate);
return db;
}
Future<void> _onCreate(Database db, int version) async {
await db.execute('''
CREATE TABLE $table (
$id INTEGER PRIMARY KEY AUTOINCREMENT,
$name TEXT
)
''');
}
}
将数据插入数据库的代码如下:
class DBOP {
static insertName(String name) async {
Database db = await DatabaseCreator().initDatabase();
final result = await db.rawInsert(
'INSERT INTO ${DatabaseCreator.table} (${DatabaseCreator.name})
VALUES($name)');
print(result);
}
}
最后,以下是我的状态小部件:
class StFull extends StatefulWidget {
@override
_StFullState createState() => _StFullState();
}
class _StFullState extends State<StFull> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('DB Demo'),
),
body: Container(
child: RaisedButton(
onPressed: _insertData,
child: Text('INSERT DATA'),
),
),
);
}
_insertData() {
DBOP.insertName('dummy_value');
}
}
您应该为值(尤其是字符串)使用参数
而不是:
await db.rawInsert(
'INSERT INTO ${DatabaseCreator.table} (${DatabaseCreator.name}) VALUES($name)');
做类似的事情:
await db.rawInsert(
'INSERT INTO ${DatabaseCreator.table} (${DatabaseCreator.name}) VALUES(?)', [name]);
或更简单:
await db.insert(DatabaseCreator.table, <String, dynamic>{DatabaseCreator.name: name});
我正在使用 Flutter SQFlite 插件开发一个使用 SQLite 数据库的 Flutter 应用程序。 问题是当我尝试插入一些测试数据时,应用程序在控制台中打印以下内容:
Unhandled Exception: DatabaseException(no such column: dummy_value (code 1): , while compiling: INSERT INTO DemoTable (name) VALUES(dummy_value)) sql 'INSERT INTO DemoTable (name) VALUES(dummy_value)' args []}
据我从日志中了解到,问题出在 'dummy_value' 列,但真正的问题在于,我的数据库有 'id' 和 'name' 列,而 'dummy_value' 是值,发送到列 'name'.
以下是我创建数据库的代码:
class DatabaseCreator {
static const table = 'DemoTable';
static const id = 'id';
static const name = 'name';
static Database db;
initDatabase() async {
Directory documentsDirectory = await
getApplicationDocumentsDirectory();
String path = join(documentsDirectory.path, 'Demo.db');
db = await openDatabase(path, version: 1, onCreate: _onCreate);
return db;
}
Future<void> _onCreate(Database db, int version) async {
await db.execute('''
CREATE TABLE $table (
$id INTEGER PRIMARY KEY AUTOINCREMENT,
$name TEXT
)
''');
}
}
将数据插入数据库的代码如下:
class DBOP {
static insertName(String name) async {
Database db = await DatabaseCreator().initDatabase();
final result = await db.rawInsert(
'INSERT INTO ${DatabaseCreator.table} (${DatabaseCreator.name})
VALUES($name)');
print(result);
}
}
最后,以下是我的状态小部件:
class StFull extends StatefulWidget {
@override
_StFullState createState() => _StFullState();
}
class _StFullState extends State<StFull> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('DB Demo'),
),
body: Container(
child: RaisedButton(
onPressed: _insertData,
child: Text('INSERT DATA'),
),
),
);
}
_insertData() {
DBOP.insertName('dummy_value');
}
}
您应该为值(尤其是字符串)使用参数
而不是:
await db.rawInsert(
'INSERT INTO ${DatabaseCreator.table} (${DatabaseCreator.name}) VALUES($name)');
做类似的事情:
await db.rawInsert(
'INSERT INTO ${DatabaseCreator.table} (${DatabaseCreator.name}) VALUES(?)', [name]);
或更简单:
await db.insert(DatabaseCreator.table, <String, dynamic>{DatabaseCreator.name: name});