Sqlite 使用外键创建表时出现语法错误
在这里,我在customerDetails表中保存客户的详细信息,并在languagesKnown表中保存用户选择的语言 因为languages列有多个值,所以我决定为它创建单独的表 谁能告诉我怎么做 弗利特说语法错误 E/SQLiteLog(5594):(1)靠近“语言”:语法错误 I/flatter(5594):错误数据库异常(接近“语言”:语法错误(代码1):,编译时:创建表语言sknown(custId INTEGER,外键(custId)引用customerDetails,语言字符串,主键(custId)))sql'创建表语言sknown(custId INTEGER,外键(custId)在打开、关闭期间引用customerDetails、语言字符串、主键(custId))'args[]} 数据库\u helper.dartSqlite 使用外键创建表时出现语法错误,sqlite,flutter,Sqlite,Flutter,在这里,我在customerDetails表中保存客户的详细信息,并在languagesKnown表中保存用户选择的语言 因为languages列有多个值,所以我决定为它创建单独的表 谁能告诉我怎么做 弗利特说语法错误 E/SQLiteLog(5594):(1)靠近“语言”:语法错误 I/flatter(5594):错误数据库异常(接近“语言”:语法错误(代码1):,编译时:创建表语言sknown(custId INTEGER,外键(custId)引用customerDetails,语言字符串,
await db.execute(
'CREATE TABLE customerDetails (custId INTEGER PRIMARY KEY AUTOINCREMENT, '
'custName STRING, '
'mobileNum STRING, company STRING, custPhoto STRING, showOnCall bool,'
'remindOn STRING,location STRING)');
await db.execute(
'CREATE TABLE languagesKnown(custId INTEGER, FOREIGN KEY (custId)REFERENCES customerDetails, language STRING,PRIMARY KEY(custId))'
);
import 'dart:async';
import 'package:customer/models/model.dart';
import 'package:path/path.dart' as p;
import 'package:sqflite/sqflite.dart';
abstract class DB {
static Database _db;
static int get _version => 1;
static Future<Database> init() async {
if (_db != null) {
return _db;
}
try {
var databasesPath = await getDatabasesPath();
String _path = p.join(databasesPath, 'Customer.db');
_db = await openDatabase(_path, version: _version, onCreate: onCreate);
print('db location:'+_path);
} catch (ex) {
print(ex);
}
}
static void onCreate(Database db, int version) async {
await db.execute(
'CREATE TABLE userDetails (id INTEGER PRIMARY KEY AUTOINCREMENT, '
'firstName STRING, '
'lastName STRING, mobileNum STRING, emailId STRING, address String,'
'userType STRING,password STRING)');
await db.execute(
'CREATE TABLE customerDetails (custId INTEGER PRIMARY KEY AUTOINCREMENT, '
'custName STRING, '
'mobileNum STRING, company STRING, custPhoto STRING, showOnCall bool,'
'remindOn STRING,location STRING)');
await db.execute(
'CREATE TABLE noteDetails (noteId INTEGER PRIMARY KEY AUTOINCREMENT, '
'custId STRING, '
'custName STRING, date STRING, note STRING, remindOn STRING,'
'priority STRING,status STRING,attachment STRING)');
await db.execute(
'CREATE TABLE languagesKnown(custId INTEGER, FOREIGN KEY (custId)REFERENCES customerDetails, language STRING,PRIMARY KEY(custId))'
);
}
static Future<List<Map<String, dynamic>>> query(String table) async =>
_db.query(table);
static Future<int> insert(String table, Model model) async =>
await _db.insert(table, model.toMap());
static Future<int> update(String table, Model model) async => await _db
.update(table, model.toMap(), where: 'id = ?', whereArgs: [model.id]);
static Future<int> delete(String table, Model model) async =>
await _db.delete(table, where: 'id = ?', whereArgs: [model.id]);
static Future<int> deleteCustomer(String table, Model model) async =>
await _db.delete(table, where: 'custId = ?', whereArgs: [model.custId]);
static Future<Batch> batch() async => _db.batch();
static Future<List<Map<String, dynamic>>> rawQuery(String table) async =>
_db.query(table);
}
数据库\u helper.dart
await db.execute(
'CREATE TABLE customerDetails (custId INTEGER PRIMARY KEY AUTOINCREMENT, '
'custName STRING, '
'mobileNum STRING, company STRING, custPhoto STRING, showOnCall bool,'
'remindOn STRING,location STRING)');
await db.execute(
'CREATE TABLE languagesKnown(custId INTEGER, FOREIGN KEY (custId)REFERENCES customerDetails, language STRING,PRIMARY KEY(custId))'
);
import 'dart:async';
import 'package:customer/models/model.dart';
import 'package:path/path.dart' as p;
import 'package:sqflite/sqflite.dart';
abstract class DB {
static Database _db;
static int get _version => 1;
static Future<Database> init() async {
if (_db != null) {
return _db;
}
try {
var databasesPath = await getDatabasesPath();
String _path = p.join(databasesPath, 'Customer.db');
_db = await openDatabase(_path, version: _version, onCreate: onCreate);
print('db location:'+_path);
} catch (ex) {
print(ex);
}
}
static void onCreate(Database db, int version) async {
await db.execute(
'CREATE TABLE userDetails (id INTEGER PRIMARY KEY AUTOINCREMENT, '
'firstName STRING, '
'lastName STRING, mobileNum STRING, emailId STRING, address String,'
'userType STRING,password STRING)');
await db.execute(
'CREATE TABLE customerDetails (custId INTEGER PRIMARY KEY AUTOINCREMENT, '
'custName STRING, '
'mobileNum STRING, company STRING, custPhoto STRING, showOnCall bool,'
'remindOn STRING,location STRING)');
await db.execute(
'CREATE TABLE noteDetails (noteId INTEGER PRIMARY KEY AUTOINCREMENT, '
'custId STRING, '
'custName STRING, date STRING, note STRING, remindOn STRING,'
'priority STRING,status STRING,attachment STRING)');
await db.execute(
'CREATE TABLE languagesKnown(custId INTEGER, FOREIGN KEY (custId)REFERENCES customerDetails, language STRING,PRIMARY KEY(custId))'
);
}
static Future<List<Map<String, dynamic>>> query(String table) async =>
_db.query(table);
static Future<int> insert(String table, Model model) async =>
await _db.insert(table, model.toMap());
static Future<int> update(String table, Model model) async => await _db
.update(table, model.toMap(), where: 'id = ?', whereArgs: [model.id]);
static Future<int> delete(String table, Model model) async =>
await _db.delete(table, where: 'id = ?', whereArgs: [model.id]);
static Future<int> deleteCustomer(String table, Model model) async =>
await _db.delete(table, where: 'custId = ?', whereArgs: [model.custId]);
static Future<Batch> batch() async => _db.batch();
static Future<List<Map<String, dynamic>>> rawQuery(String table) async =>
_db.query(table);
}
导入'dart:async';
导入“包:客户/models/model.dart”;
将“package:path/path.dart”作为p导入;
导入“包:sqflite/sqflite.dart”;
抽象类数据库{
静态数据库;
静态int get_version=>1;
静态Future init()异步{
如果(_db!=null){
返回_db;
}
试一试{
var databasesPath=等待getDatabasesPath();
字符串_path=p.join(databasesPath,'Customer.db');
_db=等待openDatabase(_路径,版本:_版本,onCreate:onCreate);
打印(“数据库位置:”+_路径);
}捕获(ex){
印刷品(ex);
}
}
静态void onCreate(数据库数据库数据库,int版本)异步{
等待db.execute(
'创建表userDetails(id整型主键自动递增,'
'名字字符串,'
'lastName字符串、mobileNum字符串、emailId字符串、地址字符串,'
'用户类型字符串,密码字符串');
等待db.execute(
'创建表customerDetails(custId INTEGER主键自动递增,'
'客户名称字符串,'
'mobileNum字符串、公司字符串、custPhoto字符串、showOnCall布尔,'
'提醒字符串,位置字符串');
等待db.execute(
'创建表noteDetails(noteId整型主键自动递增,'
'客户ID字符串,'
'客户名称字符串、日期字符串、备注字符串、提醒字符串,'
'优先级字符串、状态字符串、附件字符串');
等待db.execute(
'创建表语言SKNOWN(custId整数,外键(custId)引用customerDetails,语言字符串,主键(custId))'
);
}
静态未来查询(字符串表)异步=>
_数据库查询(表);
静态未来插入(字符串表、模型)异步=>
wait _db.insert(表,model.toMap());
静态未来更新(字符串表、模型)异步=>await\u db
.update(表,model.toMap(),其中:“id=?”,其中rgs:[model.id]);
静态未来删除(字符串表、模型)异步=>
wait _db.delete(表,其中:'id=?',wherergs:[model.id]);
静态未来删除客户(字符串表、模型)异步=>
wait _db.delete(表,其中:“custId=?”,其中rgs:[model.custId]);
静态未来批处理()异步=>_db.batch();
静态查询(字符串表)异步=>
_数据库查询(表);
}
为语言sknown表创建表SQL需要
CREATE TABLE languagesKnown(custId INTEGER REFERENCES customerDetails(custId), language STRING,PRIMARY KEY(custId))
或
- 第一个是基于列的外键定义,只需要引用部分
- 第二个是使用完整外键语法的表级
- 复合外键需要第二个(表级)
创建表languagesKnown(custId INTEGER…