SQLite删除Cascade无法正常工作

时间:2012-11-30 08:10:37

标签: android sqlite cascading-deletes

在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 个答案:

答案 0 :(得分:61)

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

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

如果您使用SQLiteOpenHelper将其放入onOpen。这是每次打开数据库时调用的地方。 <{1}}仅在创建数据库时使用一次。


第一次致电onCreateSQLiteOpenHelper次呼叫

    每次
  1. getWriteableDatabase,API级别&gt; = 16
  2. 根据数据库文件的存在和版本,在事务中调用以下内容
    • onConfigure如果没有数据库文件。通常,这只会在应用程序的整个生命周期内发生一次。
    • onCreate如果数据库版本(onUpgrade - 保存在数据库文件中)小于SQLiteOpenHelper构造函数中提供的版本。每次碰到代码中的版本时都会发生。
    • 如果文件存在且版本匹配,则无效。
  3. PRAGMA user_version每次
  4. 如果同一个onOpen实例已经有一个打开的数据库,它将只返回它,并且不会发生任何上述情况。

答案 1 :(得分:22)

尝试在Android应用中打开数据库后立即添加:

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

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

答案 2 :(得分:7)

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

public class YourOwnDbHelper extends SQLiteOpenHelper {
    @Override
    public void onOpen(SQLiteDatabase db){
        super.onOpen(db);
        db.execSQL("PRAGMA foreign_keys=ON");
    }
}

答案 3 :(得分:0)

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

  

cone.CommandText =“PRAGMA foreign_keys = ON; DELETE FROM employees   在哪里cod_emp = 0;“

每次删除时都必须这样做