Reputation: 659
In Android 4.2, using SQLite 3.7.11, when I delete a row from the Quizzes table, who's schema is below, the corresponding rows in the QuizQuestions table are not deleted.
I can't figure out what's wrong. I have tried putting
db.execSQL("PRAGMA foreign_keys = ON;");
before and after the create table statements.
Create table statements:
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);
Upvotes: 47
Views: 39689
Reputation: 3547
Sqlite disable foreign key constrain by default, so you need to enable it by simply override onOpen method in your DBhelper class like below
public class YourOwnDbHelper extends SQLiteOpenHelper {
@Override
public void onOpen(SQLiteDatabase db){
super.onOpen(db);
db.execSQL("PRAGMA foreign_keys=ON");
}
}
Upvotes: 14
Reputation: 21
i had the same issue on visual basic!!! you have to write the command text like this:
cone.CommandText = "PRAGMA foreign_keys = ON; DELETE FROM employees WHERE cod_emp=0;"
and you have to do it everytime you delete something
Upvotes: 2
Reputation: 63955
Your database should delete rows from quizQuestions
in case someone is deleting from quizzes
or from questions
. It will ignore the entire foreign key constraint in case foreign key support is turned off and you have just regular columns that can contain any value.
SQLite defaults to PRAGMA foreign_keys = OFF
every time you open the database. It's not a property of a table or of the schema.
In case you use SQLiteOpenHelper
put it in onOpen
. That is the place that is called every time the database is opened. onCreate
only once when the database is created.
What SQLiteOpenHelper
calls when you call getWriteableDatabase
for the first time is
onConfigure
every time, API Level >= 16 requiredonCreate
if there is no database file. Typically, this happens only once in the entire lifetime of the app.onUpgrade
if the database version (PRAGMA user_version
- saved inside the database file) is less then the version supplied in SQLiteOpenHelper's constructor. Happens every time you bump the version in your code.onOpen
every timeIf the same instance of SQLiteOpenHelper
already has an open database it will just return it and nothing of above happens.
Upvotes: 84
Reputation: 116078
Try adding this right after opening database in your Android app:
db.execSQL("PRAGMA foreign_keys=ON");
This turns on support for foreign keys, which is necessary for ON DELETE CASCADE
to work properly.
Upvotes: 42