在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);
答案 0 :(得分:61)
如果有人从quizQuestions
或quizzes
删除,您的数据库应删除questions
中的行。如果关闭外键支持并且您只有可以包含任何值的常规列,它将忽略整个外键约束。
每次打开数据库时,SQLite默认为PRAGMA foreign_keys = OFF
。它不是表或模式的属性。
如果您使用SQLiteOpenHelper
将其放入onOpen
。这是每次打开数据库时调用的地方。 <{1}}仅在创建数据库时使用一次。
第一次致电onCreate
时SQLiteOpenHelper
次呼叫
getWriteableDatabase
,API级别&gt; = 16 onConfigure
如果没有数据库文件。通常,这只会在应用程序的整个生命周期内发生一次。onCreate
如果数据库版本(onUpgrade
- 保存在数据库文件中)小于SQLiteOpenHelper构造函数中提供的版本。每次碰到代码中的版本时都会发生。PRAGMA user_version
每次如果同一个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;“
每次删除时都必须这样做