SQLite删除Cascade无法正常工作

Dan*_*021 33 sqlite android cascading-deletes

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

我无法弄清楚出了什么问题.我试过推杆

db.execSQL("PRAGMA foreign_keys = ON;"); 
Run Code Online (Sandbox Code Playgroud)

create table语句之前和之后.

创建表语句:

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);
Run Code Online (Sandbox Code Playgroud)

zap*_*apl 66

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

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

万一你使用SQLiteOpenHelperonOpen.这是每次打开数据库时调用的地方.onCreate创建数据库时只有一次.


什么SQLiteOpenHelper,当你调用调用getWriteableDatabase首次为

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

如果SQLiteOpenHelper已经有一个打开的数据库的同一个实例,它将只返回它,并且上面没有发生任何事情.


mvp*_*mvp 23

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

db.execSQL("PRAGMA foreign_keys=ON");
Run Code Online (Sandbox Code Playgroud)

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

  • 它似乎从API 16开始(这是你得到的)你应该在onConfigure()http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#onConfigure%28android中进行. database.sqlite.SQLiteDatabase 29% (2认同)
  • 并使用[`db.setForeignKeyConstraintsEnabled(true)`](http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#setForeignKeyConstraintsEnabled%28boolean%29) - 但最大的区别是:`onConfigure`发生在`onCreate` /`onUpdate`之前,所以你已经在那里启用了约束.例如,丢弃一个表将触发级联删除,这可能不是你想要的. (2认同)

Ken*_* S. 7

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

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