SQLite Delete Cascade не работает
В 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);
Ответы
Ответ 1
Ваша база данных должна удалять строки из quizQuestions
, если кто-то удаляет из quizzes
или из questions
. Он будет игнорировать все ограничения внешнего ключа, если поддержка внешнего ключа отключена, и у вас есть только обычные столбцы, которые могут содержать любое значение.
SQLite по умолчанию PRAGMA foreign_keys = OFF
при каждом открытии базы данных. Это не свойство таблицы или схемы.
Если вы используете SQLiteOpenHelper
, поместите его в onOpen
. Это место, которое вызывается каждый раз при открытии базы данных. onCreate
только один раз при создании базы данных.
Что вызывает SQLiteOpenHelper
, когда вы вызываете getWriteableDatabase
в первый раз, это
-
onConfigure
каждый раз, требуется уровень API >= 16
- в зависимости от наличия и версии файла базы данных в транзакции вызывается следующее:
-
onCreate
, если файл базы данных отсутствует. Как правило, это происходит только один раз за всю жизнь приложения.
-
onUpgrade
, если версия базы данных (PRAGMA user_version
- сохранена внутри файла базы данных) меньше версии, указанной в конструкторе SQLiteOpenHelper. Случается каждый раз, когда вы используете версию в своем коде.
- Ничего, если файл существует и версия соответствует.
-
onOpen
каждый раз
Если тот же экземпляр SQLiteOpenHelper
уже имеет открытую базу данных, он просто вернет его, и ничего из этого не произойдет.
Ответ 2
Попробуйте добавить это сразу после открытия базы данных в своем приложении для Android:
db.execSQL("PRAGMA foreign_keys=ON");
Это включает поддержку внешних ключей, что необходимо для правильной работы ON DELETE CASCADE
.
Ответ 3
Sqlite отключает ограничение внешнего ключа по умолчанию, поэтому вам нужно включить его с помощью просто переопределить метод onOpen в вашем классе DBhelper, как показано ниже
public class YourOwnDbHelper extends SQLiteOpenHelper {
@Override
public void onOpen(SQLiteDatabase db){
super.onOpen(db);
db.execSQL("PRAGMA foreign_keys=ON");
}
}
Ответ 4
У меня была такая же проблема на визуальной основе!!! вы должны написать текст команды следующим образом:
cone.CommandText = "PRAGMA foreign_keys = ON; УДАЛИТЬ ОТ сотрудников WHERE cod_emp = 0;"
и вы должны делать это каждый раз, когда вы что-то удаляете