Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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 QAbstracteModel::removeRow不删除相关表中的记录_Sqlite_Qt5 - Fatal编程技术网

Sqlite QAbstracteModel::removeRow不删除相关表中的记录

Sqlite QAbstracteModel::removeRow不删除相关表中的记录,sqlite,qt5,Sqlite,Qt5,Qt5.14.0,sqlite3。 我创建了两个表: CREATE TABLE manufacturing (pn TEXT PRIMARY KEY, model TEXT NOT NULL, sn TEXT, FOREIGN KEY (pn) REFERENCES settings (pn) ON DELETE CASCADE ON UPDATE CASCADE); CREATE TABLE settings (pn TEXT NOT NULL, name TEXT NOT NULL, va

Qt5.14.0,sqlite3。 我创建了两个表:

CREATE TABLE manufacturing (pn TEXT PRIMARY KEY, model TEXT NOT NULL, sn TEXT, FOREIGN KEY (pn) REFERENCES settings (pn) ON DELETE CASCADE ON UPDATE CASCADE);

CREATE TABLE settings (pn TEXT NOT NULL, name TEXT NOT NULL, value TEXT, PRIMARY KEY (pn, name));
设置
表中,我有如下记录:

abc|foo1|11
abc|foo2|22
abc|foo3|33
def|foo1|11
def|foo2|22
def|foo3|33
在表
制造中

abc|model1|123
def|model2|234
在我的应用程序中,我创建了两个
QSqlTableModel
s以在
TableView
s上显示数据:

_modelManufacturing = new QSqlTableModel(this, QSqlDatabase::database("dbData"));
_modelManufacturing->setTable("manufacturing");
_modelManufacturing->select();
ui->tableManufacturing->setModel(_modelManufacturing);

_modelSettings = new QSqlTableModel(this, QSqlDatabase::database("dbData"));
_modelSettings->setTable("settings");
ui->tableSettings->setModel(_modelSettings);
顺便说一下,我根据需要过滤第二个表:

_modelSettings->setFilter("pn=\"" + ui->linePN->text() + "\"");
_modelSettings->select();
现在,我删除
制造
表中的一行:

_modelManufacturing->removeRow(ui->listDb->currentIndex().row());
因为我已经在DELETE CASCADE上设置了
,我希望
设置
表中具有相同
pn
的记录也应该被删除。相反,它们不会受到影响

为什么??如何在删除第一个表中的相应记录时自动删除它们

更新 下面是我如何打开数据库的:

bool ManagerDatabase::openDatabase(QString name)
{
    QString filename = qApp->applicationDirPath() + "/" + name + ".sqlite";
    if (!QFile::exists(filename)) return false;

    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE", "dbData");
    db.setDatabaseName(filename);
    bool ret = db.open();
    if (ret) enableForeignKeys();
    return ret;
}

void ManagerDatabase::enableForeignKeys()
{
    QSqlQuery query(QSqlDatabase::database("dbData"));
    query.prepare("PRAGMA foreign_keys = ON;");
    query.exec();
}
…因为我已经设置了ON DELETE CASCADE标志,所以我还希望 应删除设置表中具有相同pn的记录

您误解了删除级联的
功能。
您应该期望的是,如果删除了
设置
中的一行,则
制造
中包含
设置
中已删除行的
pn
列引用的所有行也将被删除,而不是相反。
因此,父表上的删除将级联到包含此父表中列引用的表。

您可以找到更多信息。

设置
PRAGMA foreign\u keys=ON
,因为它的默认值是
OFF
。我已经将它设置为ON,question update。实际上,我发现了这个错误:
QSqlError(“1”,“无法执行语句”,“外键不匹配-\“制造”引用“设置”)
。也许是我的钥匙出了什么问题?看我的答案……是的,我刚换了钥匙。