42

在Android 4.2中,使用SQLite 3.7.11,当我从Quizzes表中删除一行时,谁的架构在下面,QuizQuestions表中的相应行不会被删除。

我不知道出了什么问题。我试过把

db.execSQL("PRAGMA foreign_keys = ON;"); 

在创建表语句之前和之后。

创建表语句:

CREATE TABLE quizzes(quiz_name TEXT PRIMARY KEY COLLATE NOCASE);

CREATE TABLE quizQuestions(quiz_name TEXT, question_id INTEGER,
     PRIMARY KEY(quiz_name, question_id),
     FOREIGN KEY(quiz_name) REFERENCES quizzes(quiz_name) ON DELETE CASCADE,
     FOREIGN KEY(question_id) REFERENCES questions(question_id) ON DELETE CASCADE);
4

4 回答 4

77

您的数据库应该删除行quizQuestions,以防有人quizzesquestions. 如果关闭外键支持并且您只有可以包含任何值的常规列,它将忽略整个外键约束。

SQLite 默认为PRAGMA foreign_keys = OFF每次打开数据库时。它不是表或模式的属性。

如果你使用SQLiteOpenHelper把它放在onOpen. 那是每次打开数据库时调用的地方。onCreate仅在创建数据库时执行一次。


当你第一次SQLiteOpenHelper打电话时,你会叫什么getWriteableDatabase

  1. onConfigure每次都需要 API 级别 >= 16
  2. 根据数据库文件的存在和版本,在事务中调用以下内容
    • onCreate如果没有数据库文件。通常,这只会在应用程序的整个生命周期中发生一次。
    • onUpgrade如果数据库版本(PRAGMA user_version- 保存在数据库文件中)小于 SQLiteOpenHelper 的构造函数中提供的版本。每次您在代码中更改版本时都会发生。
    • 如果文件存在且版本匹配,则没有任何内容。
  3. onOpen每次

如果同一个实例SQLiteOpenHelper已经有一个打开的数据库,它只会返回它,而上述任何事情都不会发生。

于 2012-11-30T08:31:21.510 回答
30

在您的 Android 应用程序中打开数据库后尝试添加此内容:

db.execSQL("PRAGMA foreign_keys=ON");

这将打开对外键的支持,这是ON DELETE CASCADE正常工作所必需的。

于 2012-11-30T08:20:01.253 回答
10

Sqlite 默认禁用外键约束,因此您需要通过简单地覆盖 DBhelper 类中的 onOpen 方法来启用它,如下所示

public class YourOwnDbHelper extends SQLiteOpenHelper {
    @Override
    public void onOpen(SQLiteDatabase db){
        super.onOpen(db);
        db.execSQL("PRAGMA foreign_keys=ON");
    }
}
于 2015-10-09T23:30:03.900 回答
1

我在visual basic上遇到了同样的问题!!!您必须像这样编写命令文本:

cone.CommandText = "PRAGMA foreign_keys = ON;从员工那里删除 cod_emp=0;"

每次删除某些内容时都必须这样做

于 2015-01-20T06:58:25.577 回答