Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sqlite 使用外键创建表时出现语法错误_Sqlite_Flutter - Fatal编程技术网

Sqlite 使用外键创建表时出现语法错误

Sqlite 使用外键创建表时出现语法错误,sqlite,flutter,Sqlite,Flutter,在这里,我在customerDetails表中保存客户的详细信息,并在languagesKnown表中保存用户选择的语言 因为languages列有多个值,所以我决定为它创建单独的表 谁能告诉我怎么做 弗利特说语法错误 E/SQLiteLog(5594):(1)靠近“语言”:语法错误 I/flatter(5594):错误数据库异常(接近“语言”:语法错误(代码1):,编译时:创建表语言sknown(custId INTEGER,外键(custId)引用customerDetails,语言字符串,

在这里,我在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.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);


}
数据库\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
创建表languagesKnown(custId INTEGER…